@metaobjectsdev/codegen-ts 0.7.0-rc.8 → 0.7.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/generator.d.ts +9 -0
- package/dist/generator.d.ts.map +1 -1
- package/dist/generator.js.map +1 -1
- package/dist/generators/docs-data-builder.d.ts +16 -0
- package/dist/generators/docs-data-builder.d.ts.map +1 -0
- package/dist/generators/docs-data-builder.js +381 -0
- package/dist/generators/docs-data-builder.js.map +1 -0
- package/dist/generators/docs-data.d.ts +98 -0
- package/dist/generators/docs-data.d.ts.map +1 -0
- package/dist/generators/docs-data.js +43 -0
- package/dist/generators/docs-data.js.map +1 -0
- package/dist/generators/docs-file.d.ts +8 -0
- package/dist/generators/docs-file.d.ts.map +1 -0
- package/dist/generators/docs-file.js +77 -0
- package/dist/generators/docs-file.js.map +1 -0
- package/dist/generators/index.d.ts +5 -0
- package/dist/generators/index.d.ts.map +1 -1
- package/dist/generators/index.js +4 -0
- package/dist/generators/index.js.map +1 -1
- package/dist/generators/routes-file-hono.d.ts +21 -0
- package/dist/generators/routes-file-hono.d.ts.map +1 -0
- package/dist/generators/routes-file-hono.js +38 -0
- package/dist/generators/routes-file-hono.js.map +1 -0
- package/dist/generators/template-generator.d.ts +41 -0
- package/dist/generators/template-generator.d.ts.map +1 -0
- package/dist/generators/template-generator.js +62 -0
- package/dist/generators/template-generator.js.map +1 -0
- package/dist/index.d.ts +6 -2
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +7 -1
- package/dist/index.js.map +1 -1
- package/dist/overwrite-policy.d.ts +39 -2
- package/dist/overwrite-policy.d.ts.map +1 -1
- package/dist/overwrite-policy.js +233 -13
- package/dist/overwrite-policy.js.map +1 -1
- package/dist/render-engine/framework-provider.d.ts +28 -0
- package/dist/render-engine/framework-provider.d.ts.map +1 -0
- package/dist/render-engine/framework-provider.js +104 -0
- package/dist/render-engine/framework-provider.js.map +1 -0
- package/dist/runner.d.ts +15 -1
- package/dist/runner.d.ts.map +1 -1
- package/dist/runner.js +44 -6
- package/dist/runner.js.map +1 -1
- package/dist/templates/docs-file.d.ts +17 -0
- package/dist/templates/docs-file.d.ts.map +1 -0
- package/dist/templates/docs-file.js +37 -0
- package/dist/templates/docs-file.js.map +1 -0
- package/dist/templates/routes-file-hono.d.ts +4 -0
- package/dist/templates/routes-file-hono.d.ts.map +1 -0
- package/dist/templates/routes-file-hono.js +119 -0
- package/dist/templates/routes-file-hono.js.map +1 -0
- package/package.json +6 -5
- package/src/generator.ts +9 -0
- package/src/generators/docs-data-builder.ts +470 -0
- package/src/generators/docs-data.ts +154 -0
- package/src/generators/docs-file.ts +87 -0
- package/src/generators/index.ts +17 -0
- package/src/generators/routes-file-hono.ts +48 -0
- package/src/generators/template-generator.ts +106 -0
- package/src/index.ts +33 -2
- package/src/overwrite-policy.ts +325 -14
- package/src/render-engine/framework-provider.ts +107 -0
- package/src/runner.ts +65 -6
- package/src/templates/docs-file.ts +51 -0
- package/src/templates/routes-file-hono.ts +142 -0
- package/templates/docs/entity-page.md.mustache +54 -0
|
@@ -0,0 +1,77 @@
|
|
|
1
|
+
// docsFile() — emits `<Entity>.md` next to each generated entity module.
|
|
2
|
+
//
|
|
3
|
+
// rc.12+: structured around a shared Mustache template at
|
|
4
|
+
// `templates/docs/entity-page.md.mustache` + a data builder at
|
|
5
|
+
// `docs-data-builder.ts`. Adopters can override the framework template by
|
|
6
|
+
// dropping their own `templates/docs/entity-page.md.mustache` into the
|
|
7
|
+
// project root (resolved via the project-then-framework provider chain).
|
|
8
|
+
//
|
|
9
|
+
// docsFile() calls `render()` directly rather than wrapping
|
|
10
|
+
// `templateGenerator()` because the per-entity output path depends on
|
|
11
|
+
// `GenContext.config.outputLayout`, which the generic templateGenerator
|
|
12
|
+
// `walk(root)` signature doesn't expose. Other future docs-style adopters
|
|
13
|
+
// with ctx-free walks (single-file aggregators, etc.) compose
|
|
14
|
+
// `templateGenerator()` directly.
|
|
15
|
+
//
|
|
16
|
+
// The conformance fixture (`fixtures/conformance/docs-file-basic`) gates
|
|
17
|
+
// byte-identity — the codegen output must match the hand-coded rc.11
|
|
18
|
+
// byte-for-byte. If you're hacking on this and the conformance test
|
|
19
|
+
// breaks, the refactor is the bug, not the fixture.
|
|
20
|
+
import { render } from "@metaobjectsdev/render";
|
|
21
|
+
import { entityOutputPath } from "../import-path.js";
|
|
22
|
+
import { projectProvider } from "../render-engine/framework-provider.js";
|
|
23
|
+
import { buildEntityDocData } from "./docs-data-builder.js";
|
|
24
|
+
/** The names of the generators that may emit sibling files for an entity.
|
|
25
|
+
* We always list them in the "Generated code" section — adopters cross-
|
|
26
|
+
* reference their own metaobjects.config.ts to confirm which are wired in.
|
|
27
|
+
* Matches the rc.11 behavior. */
|
|
28
|
+
const KNOWN_SIBLING_GENERATORS = new Set([
|
|
29
|
+
"queries-file",
|
|
30
|
+
"routes-file",
|
|
31
|
+
"routes-file-hono",
|
|
32
|
+
]);
|
|
33
|
+
const TEMPLATE_REF = "docs/entity-page.md";
|
|
34
|
+
export const docsFile = function docsFile(opts) {
|
|
35
|
+
const generator = {
|
|
36
|
+
name: "docs-file",
|
|
37
|
+
async generate(ctx) {
|
|
38
|
+
if (!ctx.renderContext) {
|
|
39
|
+
throw new Error("docs-file: renderContext is required (provided by runGen)");
|
|
40
|
+
}
|
|
41
|
+
const rc = ctx.renderContext;
|
|
42
|
+
const provider = projectProvider(ctx.projectRoot ?? process.cwd());
|
|
43
|
+
const layout = ctx.config.outputLayout ?? "flat";
|
|
44
|
+
return ctx.loadedRoot.objects().filter(ctx.matches).map((entity) => {
|
|
45
|
+
const path = entityOutputPath(layout, entity.package, `${entity.name}.md`);
|
|
46
|
+
const payload = buildEntityDocData(entity, {
|
|
47
|
+
dialect: rc.dialect,
|
|
48
|
+
...(rc.columnNamingStrategy !== undefined && {
|
|
49
|
+
columnNamingStrategy: rc.columnNamingStrategy,
|
|
50
|
+
}),
|
|
51
|
+
loadedRoot: rc.loadedRoot,
|
|
52
|
+
generatorNames: KNOWN_SIBLING_GENERATORS,
|
|
53
|
+
});
|
|
54
|
+
let content;
|
|
55
|
+
try {
|
|
56
|
+
content = render({
|
|
57
|
+
ref: TEMPLATE_REF,
|
|
58
|
+
payload,
|
|
59
|
+
provider,
|
|
60
|
+
format: "markdown",
|
|
61
|
+
});
|
|
62
|
+
}
|
|
63
|
+
catch (err) {
|
|
64
|
+
const msg = err instanceof Error ? err.message : String(err);
|
|
65
|
+
throw new Error(`docs-file: failed rendering '${TEMPLATE_REF}' for '${path}': ${msg}`, { cause: err instanceof Error ? err : undefined });
|
|
66
|
+
}
|
|
67
|
+
return { path, content };
|
|
68
|
+
});
|
|
69
|
+
},
|
|
70
|
+
};
|
|
71
|
+
if (opts?.filter)
|
|
72
|
+
generator.filter = opts.filter;
|
|
73
|
+
if (opts?.target)
|
|
74
|
+
generator.target = opts.target;
|
|
75
|
+
return generator;
|
|
76
|
+
};
|
|
77
|
+
//# sourceMappingURL=docs-file.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"docs-file.js","sourceRoot":"","sources":["../../src/generators/docs-file.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,8 +1,13 @@
|
|
|
1
1
|
export { entityFile, type EntityFileOpts } from "./entity-file.js";
|
|
2
2
|
export { queriesFile, type QueriesFileOpts } from "./queries-file.js";
|
|
3
3
|
export { routesFile, type RoutesFileOpts } from "./routes-file.js";
|
|
4
|
+
export { routesFileHono, type RoutesFileHonoOpts } from "./routes-file-hono.js";
|
|
4
5
|
export { barrel, type BarrelOpts } from "./barrel.js";
|
|
5
6
|
export { mermaidErDiagram, type MermaidErOptions } from "./mermaid-er.js";
|
|
6
7
|
export { promptRender, type PromptRenderOpts } from "./prompt-render-file.js";
|
|
7
8
|
export { outputParser, type OutputParserOpts } from "./output-parser-file.js";
|
|
9
|
+
export { docsFile, type DocsFileOpts } from "./docs-file.js";
|
|
10
|
+
export { templateGenerator, type TemplateGeneratorOpts, type TemplateWalkResult, type TemplateFormat, } from "./template-generator.js";
|
|
11
|
+
export type { EntityDocData, StorageFieldDoc, IdentityDoc, RelationshipDoc, UsedByDoc, GeneratedFileDoc, } from "./docs-data.js";
|
|
12
|
+
export { buildEntityDocData } from "./docs-data-builder.js";
|
|
8
13
|
//# sourceMappingURL=index.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/generators/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,KAAK,cAAc,EAAE,MAAM,kBAAkB,CAAC;AACnE,OAAO,EAAE,WAAW,EAAE,KAAK,eAAe,EAAE,MAAM,mBAAmB,CAAC;AACtE,OAAO,EAAE,UAAU,EAAE,KAAK,cAAc,EAAE,MAAM,kBAAkB,CAAC;AACnE,OAAO,EAAE,MAAM,EAAE,KAAK,UAAU,EAAE,MAAM,aAAa,CAAC;AACtD,OAAO,EAAE,gBAAgB,EAAE,KAAK,gBAAgB,EAAE,MAAM,iBAAiB,CAAC;AAC1E,OAAO,EAAE,YAAY,EAAE,KAAK,gBAAgB,EAAE,MAAM,yBAAyB,CAAC;AAC9E,OAAO,EAAE,YAAY,EAAE,KAAK,gBAAgB,EAAE,MAAM,yBAAyB,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/generators/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,KAAK,cAAc,EAAE,MAAM,kBAAkB,CAAC;AACnE,OAAO,EAAE,WAAW,EAAE,KAAK,eAAe,EAAE,MAAM,mBAAmB,CAAC;AACtE,OAAO,EAAE,UAAU,EAAE,KAAK,cAAc,EAAE,MAAM,kBAAkB,CAAC;AACnE,OAAO,EAAE,cAAc,EAAE,KAAK,kBAAkB,EAAE,MAAM,uBAAuB,CAAC;AAChF,OAAO,EAAE,MAAM,EAAE,KAAK,UAAU,EAAE,MAAM,aAAa,CAAC;AACtD,OAAO,EAAE,gBAAgB,EAAE,KAAK,gBAAgB,EAAE,MAAM,iBAAiB,CAAC;AAC1E,OAAO,EAAE,YAAY,EAAE,KAAK,gBAAgB,EAAE,MAAM,yBAAyB,CAAC;AAC9E,OAAO,EAAE,YAAY,EAAE,KAAK,gBAAgB,EAAE,MAAM,yBAAyB,CAAC;AAC9E,OAAO,EAAE,QAAQ,EAAE,KAAK,YAAY,EAAE,MAAM,gBAAgB,CAAC;AAC7D,OAAO,EACL,iBAAiB,EACjB,KAAK,qBAAqB,EAC1B,KAAK,kBAAkB,EACvB,KAAK,cAAc,GACpB,MAAM,yBAAyB,CAAC;AACjC,YAAY,EACV,aAAa,EACb,eAAe,EACf,WAAW,EACX,eAAe,EACf,SAAS,EACT,gBAAgB,GACjB,MAAM,gBAAgB,CAAC;AACxB,OAAO,EAAE,kBAAkB,EAAE,MAAM,wBAAwB,CAAC"}
|
package/dist/generators/index.js
CHANGED
|
@@ -1,8 +1,12 @@
|
|
|
1
1
|
export { entityFile } from "./entity-file.js";
|
|
2
2
|
export { queriesFile } from "./queries-file.js";
|
|
3
3
|
export { routesFile } from "./routes-file.js";
|
|
4
|
+
export { routesFileHono } from "./routes-file-hono.js";
|
|
4
5
|
export { barrel } from "./barrel.js";
|
|
5
6
|
export { mermaidErDiagram } from "./mermaid-er.js";
|
|
6
7
|
export { promptRender } from "./prompt-render-file.js";
|
|
7
8
|
export { outputParser } from "./output-parser-file.js";
|
|
9
|
+
export { docsFile } from "./docs-file.js";
|
|
10
|
+
export { templateGenerator, } from "./template-generator.js";
|
|
11
|
+
export { buildEntityDocData } from "./docs-data-builder.js";
|
|
8
12
|
//# sourceMappingURL=index.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/generators/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAuB,MAAM,kBAAkB,CAAC;AACnE,OAAO,EAAE,WAAW,EAAwB,MAAM,mBAAmB,CAAC;AACtE,OAAO,EAAE,UAAU,EAAuB,MAAM,kBAAkB,CAAC;AACnE,OAAO,EAAE,MAAM,EAAmB,MAAM,aAAa,CAAC;AACtD,OAAO,EAAE,gBAAgB,EAAyB,MAAM,iBAAiB,CAAC;AAC1E,OAAO,EAAE,YAAY,EAAyB,MAAM,yBAAyB,CAAC;AAC9E,OAAO,EAAE,YAAY,EAAyB,MAAM,yBAAyB,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/generators/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAuB,MAAM,kBAAkB,CAAC;AACnE,OAAO,EAAE,WAAW,EAAwB,MAAM,mBAAmB,CAAC;AACtE,OAAO,EAAE,UAAU,EAAuB,MAAM,kBAAkB,CAAC;AACnE,OAAO,EAAE,cAAc,EAA2B,MAAM,uBAAuB,CAAC;AAChF,OAAO,EAAE,MAAM,EAAmB,MAAM,aAAa,CAAC;AACtD,OAAO,EAAE,gBAAgB,EAAyB,MAAM,iBAAiB,CAAC;AAC1E,OAAO,EAAE,YAAY,EAAyB,MAAM,yBAAyB,CAAC;AAC9E,OAAO,EAAE,YAAY,EAAyB,MAAM,yBAAyB,CAAC;AAC9E,OAAO,EAAE,QAAQ,EAAqB,MAAM,gBAAgB,CAAC;AAC7D,OAAO,EACL,iBAAiB,GAIlB,MAAM,yBAAyB,CAAC;AASjC,OAAO,EAAE,kBAAkB,EAAE,MAAM,wBAAwB,CAAC"}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
import type { MetaObject } from "@metaobjectsdev/metadata";
|
|
2
|
+
import { type GeneratorFactory } from "../generator.js";
|
|
3
|
+
export interface RoutesFileHonoOpts {
|
|
4
|
+
filter?: (entity: MetaObject) => boolean;
|
|
5
|
+
target?: string;
|
|
6
|
+
}
|
|
7
|
+
/**
|
|
8
|
+
* Hono variant of routesFile() — emits `<Entity>.routes.hono.ts` mounting
|
|
9
|
+
* the same five CRUD verbs (GET list / GET :id / POST / PATCH+PUT / DELETE)
|
|
10
|
+
* against `@metaobjectsdev/runtime-ts/hono` rather than `…/drizzle-fastify`.
|
|
11
|
+
*
|
|
12
|
+
* Same cross-port wire contract (envelope shape, status codes, filter +
|
|
13
|
+
* sort + withCount semantics) as the Fastify flavor. Workers / Bun / Node
|
|
14
|
+
* consumers running Hono can replace hand-written route registration with
|
|
15
|
+
* this generator output one entity at a time.
|
|
16
|
+
*
|
|
17
|
+
* Per-entity opt-out via `@emitRoutes: false` is honored. If the user
|
|
18
|
+
* supplies their own filter, both must pass (AND).
|
|
19
|
+
*/
|
|
20
|
+
export declare const routesFileHono: GeneratorFactory<RoutesFileHonoOpts>;
|
|
21
|
+
//# sourceMappingURL=routes-file-hono.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"routes-file-hono.d.ts","sourceRoot":"","sources":["../../src/generators/routes-file-hono.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,0BAA0B,CAAC;AAC3D,OAAO,EAA6B,KAAK,gBAAgB,EAAE,MAAM,iBAAiB,CAAC;AAKnF,MAAM,WAAW,kBAAkB;IACjC,MAAM,CAAC,EAAE,CAAC,MAAM,EAAE,UAAU,KAAK,OAAO,CAAC;IACzC,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAED;;;;;;;;;;;;GAYG;AACH,eAAO,MAAM,cAAc,EAuBtB,gBAAgB,CAAC,kBAAkB,CAAC,CAAC"}
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
import { perEntity } from "../generator.js";
|
|
2
|
+
import { renderRoutesFileHono } from "../templates/routes-file-hono.js";
|
|
3
|
+
import { formatTs } from "../format.js";
|
|
4
|
+
import { entityOutputPath } from "../import-path.js";
|
|
5
|
+
/**
|
|
6
|
+
* Hono variant of routesFile() — emits `<Entity>.routes.hono.ts` mounting
|
|
7
|
+
* the same five CRUD verbs (GET list / GET :id / POST / PATCH+PUT / DELETE)
|
|
8
|
+
* against `@metaobjectsdev/runtime-ts/hono` rather than `…/drizzle-fastify`.
|
|
9
|
+
*
|
|
10
|
+
* Same cross-port wire contract (envelope shape, status codes, filter +
|
|
11
|
+
* sort + withCount semantics) as the Fastify flavor. Workers / Bun / Node
|
|
12
|
+
* consumers running Hono can replace hand-written route registration with
|
|
13
|
+
* this generator output one entity at a time.
|
|
14
|
+
*
|
|
15
|
+
* Per-entity opt-out via `@emitRoutes: false` is honored. If the user
|
|
16
|
+
* supplies their own filter, both must pass (AND).
|
|
17
|
+
*/
|
|
18
|
+
export const routesFileHono = function routesFileHono(opts) {
|
|
19
|
+
const userFilter = opts?.filter ?? (() => true);
|
|
20
|
+
const generator = {
|
|
21
|
+
name: "routes-file-hono",
|
|
22
|
+
filter: (e) => e.ownAttr("emitRoutes") !== false && userFilter(e),
|
|
23
|
+
generate: perEntity(async (entity, ctx) => {
|
|
24
|
+
if (!ctx.renderContext) {
|
|
25
|
+
throw new Error("routes-file-hono: renderContext is required (provided by runGen)");
|
|
26
|
+
}
|
|
27
|
+
return {
|
|
28
|
+
path: entityOutputPath(ctx.config.outputLayout ?? "flat", entity.package, `${entity.name}.routes.hono.ts`),
|
|
29
|
+
content: await formatTs(renderRoutesFileHono(entity, ctx.renderContext)),
|
|
30
|
+
};
|
|
31
|
+
}),
|
|
32
|
+
};
|
|
33
|
+
if (opts?.target) {
|
|
34
|
+
generator.target = opts.target;
|
|
35
|
+
}
|
|
36
|
+
return generator;
|
|
37
|
+
};
|
|
38
|
+
//# sourceMappingURL=routes-file-hono.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"routes-file-hono.js","sourceRoot":"","sources":["../../src/generators/routes-file-hono.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,SAAS,EAAyC,MAAM,iBAAiB,CAAC;AACnF,OAAO,EAAE,oBAAoB,EAAE,MAAM,kCAAkC,CAAC;AACxE,OAAO,EAAE,QAAQ,EAAE,MAAM,cAAc,CAAC;AACxC,OAAO,EAAE,gBAAgB,EAAE,MAAM,mBAAmB,CAAC;AAOrD;;;;;;;;;;;;GAYG;AACH,MAAM,CAAC,MAAM,cAAc,GAAG,SAAS,cAAc,CAAC,IAAyB;IAC7E,MAAM,UAAU,GAAG,IAAI,EAAE,MAAM,IAAI,CAAC,GAAG,EAAE,CAAC,IAAI,CAAC,CAAC;IAChD,MAAM,SAAS,GAAc;QAC3B,IAAI,EAAE,kBAAkB;QACxB,MAAM,EAAE,CAAC,CAAa,EAAE,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC,YAAY,CAAC,KAAK,KAAK,IAAI,UAAU,CAAC,CAAC,CAAC;QAC7E,QAAQ,EAAE,SAAS,CAAC,KAAK,EAAE,MAAM,EAAE,GAAG,EAAE,EAAE;YACxC,IAAI,CAAC,GAAG,CAAC,aAAa,EAAE,CAAC;gBACvB,MAAM,IAAI,KAAK,CAAC,kEAAkE,CAAC,CAAC;YACtF,CAAC;YACD,OAAO;gBACL,IAAI,EAAE,gBAAgB,CACpB,GAAG,CAAC,MAAM,CAAC,YAAY,IAAI,MAAM,EACjC,MAAM,CAAC,OAAO,EACd,GAAG,MAAM,CAAC,IAAI,iBAAiB,CAChC;gBACD,OAAO,EAAE,MAAM,QAAQ,CAAC,oBAAoB,CAAC,MAAM,EAAE,GAAG,CAAC,aAAa,CAAC,CAAC;aACzE,CAAC;QACJ,CAAC,CAAC;KACH,CAAC;IACF,IAAI,IAAI,EAAE,MAAM,EAAE,CAAC;QACjB,SAAS,CAAC,MAAM,GAAG,IAAI,CAAC,MAAM,CAAC;IACjC,CAAC;IACD,OAAO,SAAS,CAAC;AACnB,CAAyC,CAAC"}
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
import type { MetaRoot, MetaObject } from "@metaobjectsdev/metadata";
|
|
2
|
+
import { type Provider, type RenderFormat } from "@metaobjectsdev/render";
|
|
3
|
+
import type { GeneratorFactory } from "../generator.js";
|
|
4
|
+
export type TemplateFormat = RenderFormat;
|
|
5
|
+
export interface TemplateWalkResult {
|
|
6
|
+
/** The data dict to render against. Templates reference its keys; the
|
|
7
|
+
* shape is the public-API contract template authors consume. */
|
|
8
|
+
data: object;
|
|
9
|
+
/** Output path RELATIVE to the generator's target outDir. */
|
|
10
|
+
outputPath: string;
|
|
11
|
+
}
|
|
12
|
+
export interface TemplateGeneratorOpts {
|
|
13
|
+
/** kebab-case identifier; surfaces in diagnostics and the overwrite-policy
|
|
14
|
+
* per-file snapshot key. */
|
|
15
|
+
name: string;
|
|
16
|
+
/** Walk the loaded metadata tree and produce `{ data, outputPath }` tuples
|
|
17
|
+
* — one per emitted file. Pattern A (per-entity), pattern B (single
|
|
18
|
+
* aggregator), pattern C (mixed), pattern D (filter inline) all fit. */
|
|
19
|
+
walk: (root: MetaRoot) => TemplateWalkResult[] | Promise<TemplateWalkResult[]>;
|
|
20
|
+
/** Template reference. Resolved by the configured Provider chain — by
|
|
21
|
+
* default the project's `templates/<ref>.mustache` first, then the
|
|
22
|
+
* framework defaults at `codegen-ts/templates/<ref>.mustache`. */
|
|
23
|
+
template: string;
|
|
24
|
+
/** Drives the render engine's escaper. Defaults to "text". */
|
|
25
|
+
format?: TemplateFormat;
|
|
26
|
+
/** Optional per-entity filter for adopters who want to scope a generator
|
|
27
|
+
* via the standard `Generator.filter` plumbing. Not consulted by the
|
|
28
|
+
* default `walk` — adopters apply filters inside their walk function. */
|
|
29
|
+
filter?: (entity: MetaObject) => boolean;
|
|
30
|
+
/** Override the Provider used for template resolution. When omitted the
|
|
31
|
+
* generator resolves via `projectProvider(ctx.projectRoot)`, which layers
|
|
32
|
+
* the project's `templates/` over the framework defaults. (The project
|
|
33
|
+
* root is the directory holding `.metaobjects/config.json`, threaded
|
|
34
|
+
* through `GenContext` by the runner. Adopters needing a different
|
|
35
|
+
* lookup chain can pass an explicit provider.) */
|
|
36
|
+
provider?: Provider;
|
|
37
|
+
/** Optional named target — same as the other generators. */
|
|
38
|
+
target?: string;
|
|
39
|
+
}
|
|
40
|
+
export declare const templateGenerator: GeneratorFactory<TemplateGeneratorOpts>;
|
|
41
|
+
//# sourceMappingURL=template-generator.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"template-generator.d.ts","sourceRoot":"","sources":["../../src/generators/template-generator.ts"],"names":[],"mappings":"AAeA,OAAO,KAAK,EAAE,QAAQ,EAAE,UAAU,EAAE,MAAM,0BAA0B,CAAC;AACrE,OAAO,EAAU,KAAK,QAAQ,EAAE,KAAK,YAAY,EAAE,MAAM,wBAAwB,CAAC;AAClF,OAAO,KAAK,EAAsC,gBAAgB,EAAE,MAAM,iBAAiB,CAAC;AAG5F,MAAM,MAAM,cAAc,GAAG,YAAY,CAAC;AAE1C,MAAM,WAAW,kBAAkB;IACjC;qEACiE;IACjE,IAAI,EAAE,MAAM,CAAC;IACb,6DAA6D;IAC7D,UAAU,EAAE,MAAM,CAAC;CACpB;AAED,MAAM,WAAW,qBAAqB;IACpC;iCAC6B;IAC7B,IAAI,EAAE,MAAM,CAAC;IACb;;6EAEyE;IACzE,IAAI,EAAE,CAAC,IAAI,EAAE,QAAQ,KAAK,kBAAkB,EAAE,GAAG,OAAO,CAAC,kBAAkB,EAAE,CAAC,CAAC;IAC/E;;uEAEmE;IACnE,QAAQ,EAAE,MAAM,CAAC;IACjB,8DAA8D;IAC9D,MAAM,CAAC,EAAE,cAAc,CAAC;IACxB;;8EAE0E;IAC1E,MAAM,CAAC,EAAE,CAAC,MAAM,EAAE,UAAU,KAAK,OAAO,CAAC;IACzC;;;;;uDAKmD;IACnD,QAAQ,CAAC,EAAE,QAAQ,CAAC;IACpB,4DAA4D;IAC5D,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAED,eAAO,MAAM,iBAAiB,EA8CzB,gBAAgB,CAAC,qBAAqB,CAAC,CAAC"}
|
|
@@ -0,0 +1,62 @@
|
|
|
1
|
+
// templateGenerator() — the missing primitive identified by the
|
|
2
|
+
// template-driven-codegen design (2026-05-28). Walks the loaded MetaRoot
|
|
3
|
+
// → renders shared Mustache templates via @metaobjectsdev/render → emits
|
|
4
|
+
// EmittedFile[]. Same Generator interface as the per-port hand-coded
|
|
5
|
+
// generators; just adds the "Mustache template" + "walk that yields a
|
|
6
|
+
// data dict per output" primitives.
|
|
7
|
+
//
|
|
8
|
+
// Design line we adopted (from the design doc):
|
|
9
|
+
// Code → hand-coded generators (ts-poet, idiomatic per-port).
|
|
10
|
+
// Documents → templateGenerator (shared Mustache templates).
|
|
11
|
+
//
|
|
12
|
+
// docsFile() is the first templateGenerator instance (rc.12). OpenAPI specs,
|
|
13
|
+
// Mermaid diagrams, HTML doc sites, etc. follow as templates + a walk
|
|
14
|
+
// function each.
|
|
15
|
+
import { render } from "@metaobjectsdev/render";
|
|
16
|
+
import { projectProvider } from "../render-engine/framework-provider.js";
|
|
17
|
+
export const templateGenerator = function templateGenerator(opts) {
|
|
18
|
+
const fmt = opts.format ?? "text";
|
|
19
|
+
const generator = {
|
|
20
|
+
name: opts.name,
|
|
21
|
+
async generate(ctx) {
|
|
22
|
+
let provider;
|
|
23
|
+
if (opts.provider !== undefined) {
|
|
24
|
+
provider = opts.provider;
|
|
25
|
+
}
|
|
26
|
+
else if (ctx.projectRoot !== undefined) {
|
|
27
|
+
provider = projectProvider(ctx.projectRoot);
|
|
28
|
+
}
|
|
29
|
+
else {
|
|
30
|
+
ctx.warn("templateGenerator: ctx.projectRoot is undefined; falling back to process.cwd() for project-template resolution. " +
|
|
31
|
+
"Project-scoped template overrides will resolve relative to the current working directory, which is fragile under " +
|
|
32
|
+
"`meta gen` invoked from a sub-directory. Drive via runGen(opts.projectRoot) to remove this warning.");
|
|
33
|
+
provider = projectProvider(process.cwd());
|
|
34
|
+
}
|
|
35
|
+
const walkRes = await opts.walk(ctx.loadedRoot);
|
|
36
|
+
const files = [];
|
|
37
|
+
for (const { data, outputPath } of walkRes) {
|
|
38
|
+
let content;
|
|
39
|
+
try {
|
|
40
|
+
content = render({
|
|
41
|
+
ref: opts.template,
|
|
42
|
+
payload: data,
|
|
43
|
+
provider,
|
|
44
|
+
format: fmt,
|
|
45
|
+
});
|
|
46
|
+
}
|
|
47
|
+
catch (err) {
|
|
48
|
+
const msg = err instanceof Error ? err.message : String(err);
|
|
49
|
+
throw new Error(`templateGenerator(${opts.name}) failed rendering '${opts.template}' for '${outputPath}': ${msg}`, { cause: err instanceof Error ? err : undefined });
|
|
50
|
+
}
|
|
51
|
+
files.push({ path: outputPath, content });
|
|
52
|
+
}
|
|
53
|
+
return files;
|
|
54
|
+
},
|
|
55
|
+
};
|
|
56
|
+
if (opts.filter)
|
|
57
|
+
generator.filter = opts.filter;
|
|
58
|
+
if (opts.target)
|
|
59
|
+
generator.target = opts.target;
|
|
60
|
+
return generator;
|
|
61
|
+
};
|
|
62
|
+
//# sourceMappingURL=template-generator.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"template-generator.js","sourceRoot":"","sources":["../../src/generators/template-generator.ts"],"names":[],"mappings":"AAAA,gEAAgE;AAChE,yEAAyE;AACzE,yEAAyE;AACzE,qEAAqE;AACrE,sEAAsE;AACtE,oCAAoC;AACpC,EAAE;AACF,gDAAgD;AAChD,gEAAgE;AAChE,+DAA+D;AAC/D,EAAE;AACF,6EAA6E;AAC7E,sEAAsE;AACtE,iBAAiB;AAGjB,OAAO,EAAE,MAAM,EAAoC,MAAM,wBAAwB,CAAC;AAElF,OAAO,EAAE,eAAe,EAAE,MAAM,wCAAwC,CAAC;AAyCzE,MAAM,CAAC,MAAM,iBAAiB,GAAG,SAAS,iBAAiB,CACzD,IAA2B;IAE3B,MAAM,GAAG,GAAmB,IAAI,CAAC,MAAM,IAAI,MAAM,CAAC;IAClD,MAAM,SAAS,GAAc;QAC3B,IAAI,EAAE,IAAI,CAAC,IAAI;QACf,KAAK,CAAC,QAAQ,CAAC,GAAe;YAC5B,IAAI,QAAkB,CAAC;YACvB,IAAI,IAAI,CAAC,QAAQ,KAAK,SAAS,EAAE,CAAC;gBAChC,QAAQ,GAAG,IAAI,CAAC,QAAQ,CAAC;YAC3B,CAAC;iBAAM,IAAI,GAAG,CAAC,WAAW,KAAK,SAAS,EAAE,CAAC;gBACzC,QAAQ,GAAG,eAAe,CAAC,GAAG,CAAC,WAAW,CAAC,CAAC;YAC9C,CAAC;iBAAM,CAAC;gBACN,GAAG,CAAC,IAAI,CACN,kHAAkH;oBAClH,mHAAmH;oBACnH,qGAAqG,CACtG,CAAC;gBACF,QAAQ,GAAG,eAAe,CAAC,OAAO,CAAC,GAAG,EAAE,CAAC,CAAC;YAC5C,CAAC;YACD,MAAM,OAAO,GAAG,MAAM,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC;YAChD,MAAM,KAAK,GAAkB,EAAE,CAAC;YAChC,KAAK,MAAM,EAAE,IAAI,EAAE,UAAU,EAAE,IAAI,OAAO,EAAE,CAAC;gBAC3C,IAAI,OAAe,CAAC;gBACpB,IAAI,CAAC;oBACH,OAAO,GAAG,MAAM,CAAC;wBACf,GAAG,EAAE,IAAI,CAAC,QAAQ;wBAClB,OAAO,EAAE,IAAI;wBACb,QAAQ;wBACR,MAAM,EAAE,GAAG;qBACZ,CAAC,CAAC;gBACL,CAAC;gBAAC,OAAO,GAAG,EAAE,CAAC;oBACb,MAAM,GAAG,GAAG,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;oBAC7D,MAAM,IAAI,KAAK,CACb,qBAAqB,IAAI,CAAC,IAAI,uBAAuB,IAAI,CAAC,QAAQ,UAAU,UAAU,MAAM,GAAG,EAAE,EACjG,EAAE,KAAK,EAAE,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,SAAS,EAAE,CAClD,CAAC;gBACJ,CAAC;gBACD,KAAK,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,UAAU,EAAE,OAAO,EAAE,CAAC,CAAC;YAC5C,CAAC;YACD,OAAO,KAAK,CAAC;QACf,CAAC;KACF,CAAC;IACF,IAAI,IAAI,CAAC,MAAM;QAAE,SAAS,CAAC,MAAM,GAAG,IAAI,CAAC,MAAM,CAAC;IAChD,IAAI,IAAI,CAAC,MAAM;QAAE,SAAS,CAAC,MAAM,GAAG,IAAI,CAAC,MAAM,CAAC;IAChD,OAAO,SAAS,CAAC;AACnB,CAA4C,CAAC"}
|
package/dist/index.d.ts
CHANGED
|
@@ -12,8 +12,8 @@ export type { RelationEntry, RelationMap } from "./relation-resolver.js";
|
|
|
12
12
|
export { buildRelationMap } from "./relation-resolver.js";
|
|
13
13
|
export type { RenderContext } from "./render-context.js";
|
|
14
14
|
export { makeRenderContext } from "./render-context.js";
|
|
15
|
-
export type { WriteStatus, WriteResult, MergeStrategy } from "./overwrite-policy.js";
|
|
16
|
-
export { decideAndWrite } from "./overwrite-policy.js";
|
|
15
|
+
export type { WriteStatus, WriteResult, MergeStrategy, BaselineMode, DecideAndWriteOpts, } from "./overwrite-policy.js";
|
|
16
|
+
export { decideAndWrite, GitMissingError } from "./overwrite-policy.js";
|
|
17
17
|
export { CodegenError } from "./errors.js";
|
|
18
18
|
export { GENERATED_HEADER, EXTRA_SUFFIX, DEFAULT_OUT_DIR } from "./constants.js";
|
|
19
19
|
export { formatTs } from "./format.js";
|
|
@@ -27,4 +27,8 @@ export { emitViewDdl } from "./projection/view-ddl-emit.js";
|
|
|
27
27
|
export type { EmitOptions as ViewDdlEmitOptions } from "./projection/view-ddl-emit.js";
|
|
28
28
|
export type { JoinNode, JoinTree, SelectColumn, SelectSpec, ViewSpec } from "./projection/view-spec.js";
|
|
29
29
|
export { generatePayloadInterfaces, generatePayloadInterfacesBatch, generateRenderHandle } from "./payload-codegen.js";
|
|
30
|
+
export { templateGenerator, type TemplateGeneratorOpts, type TemplateWalkResult, type TemplateFormat, } from "./generators/template-generator.js";
|
|
31
|
+
export { FileSystemProvider, ProviderChain, frameworkTemplatesProvider, projectProvider, } from "./render-engine/framework-provider.js";
|
|
32
|
+
export type { EntityDocData, StorageFieldDoc, IdentityDoc, RelationshipDoc, UsedByDoc, GeneratedFileDoc, } from "./generators/docs-data.js";
|
|
33
|
+
export { buildEntityDocData } from "./generators/docs-data-builder.js";
|
|
30
34
|
//# sourceMappingURL=index.d.ts.map
|
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAKA,OAAO,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AACrC,YAAY,EAAE,UAAU,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAE5D,YAAY,EAAE,SAAS,EAAE,UAAU,EAAE,WAAW,EAAE,gBAAgB,EAAE,MAAM,gBAAgB,CAAC;AAC3F,OAAO,EAAE,SAAS,EAAE,UAAU,EAAE,MAAM,gBAAgB,CAAC;AAEvD,YAAY,EAAE,oBAAoB,EAAE,8BAA8B,EAAE,iBAAiB,EAAE,OAAO,EAAE,QAAQ,EAAE,oBAAoB,EAAE,oBAAoB,EAAE,MAAM,yBAAyB,CAAC;AACtL,OAAO,EAAE,YAAY,EAAE,eAAe,EAAE,MAAM,yBAAyB,CAAC;AAExE,YAAY,EAAE,UAAU,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AAClE,OAAO,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AAEnD,YAAY,EAAE,MAAM,EAAE,MAAM,kBAAkB,CAAC;AAC/C,OAAO,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAE9C,YAAY,EAAE,aAAa,EAAE,WAAW,EAAE,MAAM,wBAAwB,CAAC;AACzE,OAAO,EAAE,gBAAgB,EAAE,MAAM,wBAAwB,CAAC;AAE1D,YAAY,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AACzD,OAAO,EAAE,iBAAiB,EAAE,MAAM,qBAAqB,CAAC;AAExD,YAAY,
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|
package/dist/index.js
CHANGED
|
@@ -9,7 +9,7 @@ export { mapColumnType } from "./column-mapper.js";
|
|
|
9
9
|
export { buildPkMap } from "./pk-resolver.js";
|
|
10
10
|
export { buildRelationMap } from "./relation-resolver.js";
|
|
11
11
|
export { makeRenderContext } from "./render-context.js";
|
|
12
|
-
export { decideAndWrite } from "./overwrite-policy.js";
|
|
12
|
+
export { decideAndWrite, GitMissingError } from "./overwrite-policy.js";
|
|
13
13
|
export { CodegenError } from "./errors.js";
|
|
14
14
|
export { GENERATED_HEADER, EXTRA_SUFFIX, DEFAULT_OUT_DIR } from "./constants.js";
|
|
15
15
|
export { formatTs } from "./format.js";
|
|
@@ -20,4 +20,10 @@ export { extractViewSpec } from "./projection/extract-view-spec.js";
|
|
|
20
20
|
export { emitViewDdl } from "./projection/view-ddl-emit.js";
|
|
21
21
|
// Prompt construction (FR-004): typed payload + render-handle codegen.
|
|
22
22
|
export { generatePayloadInterfaces, generatePayloadInterfacesBatch, generateRenderHandle } from "./payload-codegen.js";
|
|
23
|
+
// Template-driven codegen (rc.12). Factory + framework Provider for adopters
|
|
24
|
+
// who want to wire their own templateGenerator instances. The default
|
|
25
|
+
// docsFile() uses this internally.
|
|
26
|
+
export { templateGenerator, } from "./generators/template-generator.js";
|
|
27
|
+
export { FileSystemProvider, ProviderChain, frameworkTemplatesProvider, projectProvider, } from "./render-engine/framework-provider.js";
|
|
28
|
+
export { buildEntityDocData } from "./generators/docs-data-builder.js";
|
|
23
29
|
//# sourceMappingURL=index.js.map
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,qDAAqD;AACrD,EAAE;AACF,yCAAyC;AACzC,wEAAwE;AAExE,OAAO,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AAIrC,OAAO,EAAE,SAAS,EAAE,UAAU,EAAE,MAAM,gBAAgB,CAAC;AAGvD,OAAO,EAAE,YAAY,EAAE,eAAe,EAAE,MAAM,yBAAyB,CAAC;AAGxE,OAAO,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AAGnD,OAAO,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAG9C,OAAO,EAAE,gBAAgB,EAAE,MAAM,wBAAwB,CAAC;AAG1D,OAAO,EAAE,iBAAiB,EAAE,MAAM,qBAAqB,CAAC;
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,qDAAqD;AACrD,EAAE;AACF,yCAAyC;AACzC,wEAAwE;AAExE,OAAO,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AAIrC,OAAO,EAAE,SAAS,EAAE,UAAU,EAAE,MAAM,gBAAgB,CAAC;AAGvD,OAAO,EAAE,YAAY,EAAE,eAAe,EAAE,MAAM,yBAAyB,CAAC;AAGxE,OAAO,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AAGnD,OAAO,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAG9C,OAAO,EAAE,gBAAgB,EAAE,MAAM,wBAAwB,CAAC;AAG1D,OAAO,EAAE,iBAAiB,EAAE,MAAM,qBAAqB,CAAC;AASxD,OAAO,EAAE,cAAc,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAC;AAExE,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAC3C,OAAO,EAAE,gBAAgB,EAAE,YAAY,EAAE,eAAe,EAAE,MAAM,gBAAgB,CAAC;AAEjF,OAAO,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAC;AAEvC,OAAO,EAAE,SAAS,EAAE,mBAAmB,EAAE,mBAAmB,EAAE,sBAAsB,EAAE,MAAM,aAAa,CAAC;AAE1G,OAAO,EAAE,aAAa,EAAE,gBAAgB,EAAE,oBAAoB,EAAE,oBAAoB,EAAE,uBAAuB,EAAE,qBAAqB,EAAE,gBAAgB,EAAE,qBAAqB,EAAE,MAAM,kBAAkB,CAAC;AAGxM,OAAO,EAAE,YAAY,EAAE,cAAc,EAAE,MAAM,qCAAqC,CAAC;AACnF,OAAO,EAAE,eAAe,EAAE,MAAM,mCAAmC,CAAC;AAEpE,OAAO,EAAE,WAAW,EAAE,MAAM,+BAA+B,CAAC;AAG5D,uEAAuE;AACvE,OAAO,EAAE,yBAAyB,EAAE,8BAA8B,EAAE,oBAAoB,EAAE,MAAM,sBAAsB,CAAC;AAEvH,6EAA6E;AAC7E,sEAAsE;AACtE,mCAAmC;AACnC,OAAO,EACL,iBAAiB,GAIlB,MAAM,oCAAoC,CAAC;AAC5C,OAAO,EACL,kBAAkB,EAClB,aAAa,EACb,0BAA0B,EAC1B,eAAe,GAChB,MAAM,uCAAuC,CAAC;AAS/C,OAAO,EAAE,kBAAkB,EAAE,MAAM,mCAAmC,CAAC"}
|
|
@@ -1,8 +1,45 @@
|
|
|
1
|
-
export type WriteStatus = "new" | "overwrite" | "refused" | "skipped";
|
|
1
|
+
export type WriteStatus = "new" | "unchanged" | "overwrite" | "merged" | "conflict" | "refused" | "skipped";
|
|
2
|
+
/**
|
|
3
|
+
* "overwrite" — default; three-way merge if .gen-state exists, else write-if-
|
|
4
|
+
* different / first-time-existing flow.
|
|
5
|
+
* "skip-existing" — never write over an existing file; status "skipped".
|
|
6
|
+
* Useful for `meta gen --dry-run` style flows.
|
|
7
|
+
*/
|
|
2
8
|
export type MergeStrategy = "overwrite" | "skip-existing";
|
|
9
|
+
/** "default" — the standard three-way merge flow described in the file header.
|
|
10
|
+
* "fresh" — opt-in via `meta gen --baseline=fresh`. When .gen-state is absent
|
|
11
|
+
* but the file exists, OVERWRITE with fresh content and seed .gen-state from
|
|
12
|
+
* the fresh content (caveat 3 escape hatch). */
|
|
13
|
+
export type BaselineMode = "default" | "fresh";
|
|
14
|
+
export interface DecideAndWriteOpts {
|
|
15
|
+
strategy?: MergeStrategy;
|
|
16
|
+
/** Absolute path to the .gen-state/ root for this project. When undefined,
|
|
17
|
+
* we fall back to a process-isolated tmpdir — fine for tests but the CLI
|
|
18
|
+
* always supplies the real project value via runGen(). */
|
|
19
|
+
genStateDir?: string;
|
|
20
|
+
/** Path the snapshot is keyed by — usually the path relative to the
|
|
21
|
+
* project root, but ANY stable identifier works. When undefined, derived
|
|
22
|
+
* from `path` (so unit tests can call without supplying it). */
|
|
23
|
+
outputRelPath?: string;
|
|
24
|
+
/** First-time-existing-file behavior. */
|
|
25
|
+
baseline?: BaselineMode;
|
|
26
|
+
}
|
|
3
27
|
export interface WriteResult {
|
|
4
28
|
path: string;
|
|
5
29
|
status: WriteStatus;
|
|
30
|
+
/** Present when status is "conflict" — human-readable hint identifying the
|
|
31
|
+
* file the user must resolve. */
|
|
32
|
+
conflictHint?: string;
|
|
33
|
+
}
|
|
34
|
+
/** Thrown when git is unavailable. Surfaces as a clear CLI error rather than
|
|
35
|
+
* a generic ENOENT halfway through a regen. */
|
|
36
|
+
export declare class GitMissingError extends Error {
|
|
37
|
+
constructor();
|
|
6
38
|
}
|
|
7
|
-
|
|
39
|
+
/**
|
|
40
|
+
* The main entry point. Backward-compatible with the rc.11 signature: passing
|
|
41
|
+
* a `MergeStrategy` string as the third argument continues to work; passing
|
|
42
|
+
* an options object opts into three-way merge.
|
|
43
|
+
*/
|
|
44
|
+
export declare function decideAndWrite(path: string, content: string, optsOrStrategy?: DecideAndWriteOpts | MergeStrategy): WriteResult;
|
|
8
45
|
//# sourceMappingURL=overwrite-policy.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"overwrite-policy.d.ts","sourceRoot":"","sources":["../src/overwrite-policy.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"overwrite-policy.d.ts","sourceRoot":"","sources":["../src/overwrite-policy.ts"],"names":[],"mappings":"AAqCA,MAAM,MAAM,WAAW,GACnB,KAAK,GACL,WAAW,GACX,WAAW,GACX,QAAQ,GACR,UAAU,GACV,SAAS,GACT,SAAS,CAAC;AAEd;;;;;GAKG;AACH,MAAM,MAAM,aAAa,GAAG,WAAW,GAAG,eAAe,CAAC;AAE1D;;;iDAGiD;AACjD,MAAM,MAAM,YAAY,GAAG,SAAS,GAAG,OAAO,CAAC;AAE/C,MAAM,WAAW,kBAAkB;IACjC,QAAQ,CAAC,EAAE,aAAa,CAAC;IACzB;;+DAE2D;IAC3D,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB;;qEAEiE;IACjE,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,yCAAyC;IACzC,QAAQ,CAAC,EAAE,YAAY,CAAC;CACzB;AAED,MAAM,WAAW,WAAW;IAC1B,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,WAAW,CAAC;IACpB;sCACkC;IAClC,YAAY,CAAC,EAAE,MAAM,CAAC;CACvB;AAoED;gDACgD;AAChD,qBAAa,eAAgB,SAAQ,KAAK;;CAQzC;AAsFD;;;;GAIG;AACH,wBAAgB,cAAc,CAC5B,IAAI,EAAE,MAAM,EACZ,OAAO,EAAE,MAAM,EACf,cAAc,GAAE,kBAAkB,GAAG,aAAkB,GACtD,WAAW,CAgGb"}
|