@rivetjs/nx 0.1.0-alpha.0 → 0.1.0-alpha.2

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/README.md CHANGED
@@ -1,6 +1,6 @@
1
1
  # @rivetjs/nx
2
2
 
3
- [Nx](https://nx.dev) plugin for [Rivet](https://github.com/rivetjs/rivet): a workspace preset, generators for apps,
3
+ [Nx](https://nx.dev) plugin for [Rivet](https://github.com/N1XUS/rivetjs): a workspace preset, generators for apps,
4
4
  libraries, routes and components, executors, and inferred `build` / `dev` / `preview` / `test` / `check` /
5
5
  `typecheck` targets with Nx caching.
6
6
 
@@ -26,7 +26,7 @@ Node.js 24 or newer, Nx 23.
26
26
  | `component` | `c` | A resumable component + test: `--kind=basic\|overlay` (render-function children), `--story` (a `/stories/<name>` page), `--directory`, `--export`. |
27
27
  | `route` | `r`, `page` | A file route: `blog/[slug]`, `docs/[[lang]]/[...path]`, `(group)/page`; `--loader`, `--action`, `--guard`, `--layout`. |
28
28
  | `layout` | | `src/routes/<dir>/_layout.tsx`, `--guard`. |
29
- | `api-route` | `endpoint` | An endpoint route with `onGet` / `onPost` / … (`--methods=get,post`). |
29
+ | `api-route` | `endpoint` | An endpoint route with `onGet(…)` / `onPost(…)` / … exports (`--methods=get,post`). |
30
30
  | `ui-setup` | | `@rivetjs/ui` + Tailwind v4 + its styles (Rivet theme; other looks = `@rivetjs/ui/theme` presets). |
31
31
  | `i18n-setup` | | `@rivetjs/i18n`: `i18n.config.ts`, catalogs, the Vite plugin (`--locales=en,de`, `--prefix`). |
32
32
  | `init` | | Plugin in `nx.json`, shared tooling dependencies, `.rivet` in `.gitignore`. |
@@ -47,6 +47,8 @@ All generators write through the Nx tree: `--dry-run` shows the files without wr
47
47
  | `@rivetjs/nx:typecheck` | `rivet sync` + `tsc --noEmit`. |
48
48
  | `@rivetjs/nx:package` | Publishable library: `.js` / `.jsx` (JSX preserved) + `.d.ts`, mapped `package.json`. |
49
49
 
50
+ The `check` executor also accepts `format: "json"`, `quiet: true` and `verbose: true`. JSON mode hides successful sync output and executor headings; Nx can still add its own task summary. Use `rivet-check --json` directly for a pipe consumed by a JSON parser. Step headings, durations and failure hints use stderr.
51
+
50
52
  ## Inferred targets
51
53
 
52
54
  ```json
@@ -61,4 +63,4 @@ Every folder with a `package.json` or `project.json` and a Rivet Vite config (`r
61
63
  make `preview` run `wrangler dev` / Bun / Deno. `build`, `test`, `check`, `typecheck` are cached; `.rivet/`,
62
64
  `dist/` and `coverage/` are never inputs; `build` outputs `{projectRoot}/dist`.
63
65
 
64
- Docs: [Nx guide](https://github.com/rivetjs/rivet/blob/main/apps/docs/content/guides/tooling/nx.md).
66
+ Docs: [Nx guide](https://github.com/N1XUS/rivetjs/blob/main/apps/docs/content/guides/tooling/nx.md).
@@ -7,8 +7,17 @@ export function syncStep(root, bin) {
7
7
  export function checkSteps(options, root, facts, bin) {
8
8
  const routed = facts?.kind === "app";
9
9
  const steps = [];
10
- if (options.sync ?? routed)
11
- steps.push(syncStep(root, bin));
10
+ if (options.sync ?? routed) {
11
+ const step = syncStep(root, bin);
12
+ if (options.format === "json")
13
+ step.args.push("--json", "--quiet");
14
+ else if (options.quiet)
15
+ step.args.push("--quiet");
16
+ // Capture successful sync JSON so stdout contains only the check result.
17
+ if (options.format === "json")
18
+ step.quietSuccess = true;
19
+ steps.push(step);
20
+ }
12
21
  const configs = options.tsConfig === undefined ? ["tsconfig.json"] : Array.isArray(options.tsConfig) ? options.tsConfig : [options.tsConfig];
13
22
  steps.push({
14
23
  label: "rivet-check",
@@ -19,6 +28,8 @@ export function checkSteps(options, root, facts, bin) {
19
28
  ["--no-types", options.types === false],
20
29
  ["--no-manifest", !(options.manifest ?? routed)],
21
30
  ["--format", options.format],
31
+ ["--quiet", options.quiet],
32
+ ["--verbose", options.verbose],
22
33
  ]),
23
34
  ],
24
35
  cwd: root,
@@ -27,5 +38,5 @@ export function checkSteps(options, root, facts, bin) {
27
38
  }
28
39
  export default async function checkExecutor(options, context) {
29
40
  const root = projectRoot(context);
30
- return runSteps(checkSteps(options, root, projectFacts(root), resolverFrom(root)));
41
+ return runSteps(checkSteps(options, root, projectFacts(root), resolverFrom(root)), { verbose: !options.quiet && options.format !== "json" });
31
42
  }
@@ -1,12 +1,16 @@
1
1
  export interface CheckExecutorSchema {
2
2
  /** tsconfig file(s) to check, relative to the project. Default `tsconfig.json`. */
3
3
  tsConfig?: string | string[];
4
- /** Type-aware checks (RV2101 serializability, RV3101 route links). Default true. */
4
+ /** Type-aware checks (RV3101 route links). Default true. */
5
5
  types?: boolean;
6
6
  /** Check `.rivet/editor.json` (RV7101 / RV7102). Default: routed apps only. */
7
7
  manifest?: boolean;
8
8
  /** Run `rivet sync` first (regenerates `.rivet/`). Default: routed apps only. */
9
9
  sync?: boolean;
10
10
  /** Output format. */
11
+ /** Errors only. */
12
+ quiet?: boolean;
13
+ /** Include error stacks. */
14
+ verbose?: boolean;
11
15
  format?: "text" | "json";
12
16
  }
@@ -6,13 +6,45 @@
6
6
  "type": "object",
7
7
  "properties": {
8
8
  "tsConfig": {
9
- "oneOf": [{ "type": "string" }, { "type": "array", "items": { "type": "string" } }],
9
+ "oneOf": [
10
+ {
11
+ "type": "string"
12
+ },
13
+ {
14
+ "type": "array",
15
+ "items": {
16
+ "type": "string"
17
+ }
18
+ }
19
+ ],
10
20
  "description": "tsconfig file(s) to check, relative to the project. Default tsconfig.json."
11
21
  },
12
- "types": { "type": "boolean", "default": true, "description": "Type-aware checks (RV2101 serializability, RV3101 route links)." },
13
- "manifest": { "type": "boolean", "description": "Check .rivet/editor.json (RV7101 / RV7102). Default: routed apps only." },
14
- "sync": { "type": "boolean", "description": "Run rivet sync first. Default: routed apps only." },
15
- "format": { "type": "string", "enum": ["text", "json"], "description": "Output format." }
22
+ "types": {
23
+ "type": "boolean",
24
+ "default": true,
25
+ "description": "Type-aware checks (RV3101 route links)."
26
+ },
27
+ "manifest": {
28
+ "type": "boolean",
29
+ "description": "Check .rivet/editor.json (RV7101 / RV7102). Default: routed apps only."
30
+ },
31
+ "sync": {
32
+ "type": "boolean",
33
+ "description": "Run rivet sync first. Default: routed apps only."
34
+ },
35
+ "format": {
36
+ "type": "string",
37
+ "enum": ["text", "json"],
38
+ "description": "Output format."
39
+ },
40
+ "quiet": {
41
+ "type": "boolean",
42
+ "description": "Errors only; suppress warnings, progress and summaries."
43
+ },
44
+ "verbose": {
45
+ "type": "boolean",
46
+ "description": "Include error stacks from rivet-check (also DEBUG=rivet)."
47
+ }
16
48
  },
17
49
  "additionalProperties": false
18
50
  }
@@ -4,6 +4,8 @@ import type { ExecutorContext } from "@nx/devkit";
4
4
  export interface Step {
5
5
  /** Shown before the step runs. */
6
6
  label: string;
7
+ /** Buffer stdout and replay it only on failure (JSON prerequisite steps). */
8
+ quietSuccess?: boolean;
7
9
  /** Arguments after the Node binary (`[bin, …args]` or `["--input-type=module", "-e", code]`). */
8
10
  args: string[];
9
11
  cwd: string;
package/executors/run.js CHANGED
@@ -62,14 +62,25 @@ function hookSignals() {
62
62
  /** Starts a step; `exit` resolves with its status (signals count as failure). */
63
63
  export function start(step) {
64
64
  hookSignals();
65
- const child = spawn(process.execPath, step.args, { cwd: step.cwd, env: { ...process.env, ...step.env }, stdio: "inherit" });
65
+ const child = spawn(process.execPath, step.args, {
66
+ cwd: step.cwd,
67
+ env: { ...process.env, ...step.env },
68
+ stdio: step.quietSuccess ? ["inherit", "pipe", "inherit"] : "inherit",
69
+ });
66
70
  children.add(child);
71
+ const output = [];
72
+ if (step.quietSuccess)
73
+ child.stdout?.on("data", (chunk) => output.push(chunk));
67
74
  const exit = new Promise((done) => {
68
75
  child.on("error", (error) => {
69
- console.error(error);
76
+ children.delete(child);
77
+ console.error(`[rivet:nx] error: ${step.label} could not start in ${step.cwd}: ${error.message}\n fix: Check the working directory and tool installation.${process.env.DEBUG === "rivet" ? "\n" + error.stack : ""}`);
70
78
  done(1);
71
79
  });
72
- child.on("exit", (code) => {
80
+ child.on("close", (code) => {
81
+ if (step.quietSuccess && code !== 0)
82
+ for (const chunk of output)
83
+ process.stdout.write(chunk);
73
84
  children.delete(child);
74
85
  done(code ?? 1);
75
86
  });
@@ -79,10 +90,17 @@ export function start(step) {
79
90
  /** Runs steps in order; stops at the first failure. */
80
91
  export async function runSteps(steps, { verbose = true } = {}) {
81
92
  for (const step of steps) {
93
+ const started = performance.now();
82
94
  if (verbose)
83
- console.log(`> ${step.label}`);
84
- if ((await start(step).exit) !== 0)
95
+ console.error(`[rivet:nx] ${step.label} (${step.cwd})`);
96
+ const status = await start(step).exit;
97
+ if (status !== 0) {
98
+ if (verbose)
99
+ console.error(`[rivet:nx] error: ${step.label} exited ${status}. Fix the diagnostic above and rerun the target.`);
85
100
  return { success: false };
101
+ }
102
+ if (verbose)
103
+ console.error(`[rivet:nx] ${step.label} finished in ${((performance.now() - started) / 1000).toFixed(1)} s`);
86
104
  }
87
105
  return { success: true };
88
106
  }
@@ -1,11 +1,11 @@
1
- import type { RequestEvent } from "@rivetjs/router";
1
+ import { <%- methods.map((method) => "on" + method[0].toUpperCase() + method.slice(1)).join(", ") %>, type RequestEvent } from "@rivetjs/router";
2
2
  <% for (const method of methods) { %>
3
3
  /** `<%= method.toUpperCase() %> <%= url %>`. Runs only on the server; must return a `Response`. */
4
- export const on<%= method[0].toUpperCase() + method.slice(1) %> = async (<% if (method === "get" || method === "delete") { %>{ params }<% } else { %>{ request, params }<% } %>: RequestEvent) => {<% if (method === "get") { %>
4
+ export const <%= method.toUpperCase() %> = on<%= method[0].toUpperCase() + method.slice(1) %>(async (<% if (method === "get" || method === "delete") { %>{ params }<% } else { %>{ request, params }<% } %>: RequestEvent) => {<% if (method === "get") { %>
5
5
  return Response.json({ ok: true, params }, { headers: { "cache-control": "no-store" } });<% } else if (method === "delete") { %>
6
6
  console.log("delete", params);
7
7
  return new Response(null, { status: 204 });<% } else { %>
8
8
  const body: unknown = await request.json().catch(() => null);
9
9
  return Response.json({ ok: true, params, body }<% if (method === "post") { %>, { status: 201 }<% } %>);<% } %>
10
- };
10
+ });
11
11
  <% } %>
@@ -2,7 +2,7 @@
2
2
  "$schema": "https://json-schema.org/schema",
3
3
  "$id": "RivetApiRoute",
4
4
  "title": "Rivet API route",
5
- "description": "Adds an endpoint route (a plain .ts file in src/routes with onGet / onPost / … request handlers) to a server-rendered Rivet app.",
5
+ "description": "Adds an endpoint route (a plain .ts file in src/routes with onGet(…) / onPost(…) / … request handler exports) to a server-rendered Rivet app.",
6
6
  "type": "object",
7
7
  "properties": {
8
8
  "path": {
@@ -1,9 +1,9 @@
1
- <% if (guard) { %>import { redirect, type LayoutProps, type RequestEvent } from "@rivetjs/router";
1
+ <% if (guard) { %>import { guard, redirect, type LayoutProps, type RequestEvent } from "@rivetjs/router";
2
2
 
3
3
  /** Runs for every page and endpoint in this folder, before their loaders. */
4
- export const serverGuard = ({ cookies, url }: RequestEvent) => {
4
+ export const access = guard(({ cookies, url }: RequestEvent) => {
5
5
  if (!cookies.get("session")) return redirect("/login?next=" + encodeURIComponent(url.pathname));
6
- };
6
+ });
7
7
  <% } else { %>import type { LayoutProps } from "@rivetjs/router";
8
8
  <% } %>
9
9
  /** Wraps every page in <%= where %>. Stays mounted across client navigation between them. */
@@ -3,7 +3,7 @@ export interface LayoutGeneratorSchema {
3
3
  directory?: string;
4
4
  /** The Rivet app. */
5
5
  project: string;
6
- /** `serverGuard` for the whole folder (redirects to /login without a `session` cookie). */
6
+ /** A `guard(…)` export for the whole folder (redirects to /login without a `session` cookie). */
7
7
  guard?: boolean;
8
8
  skipFormat?: boolean;
9
9
  }
@@ -2,7 +2,7 @@
2
2
  "$schema": "https://json-schema.org/schema",
3
3
  "$id": "RivetLayout",
4
4
  "title": "Rivet layout",
5
- "description": "Adds a _layout.tsx to a folder of a Rivet app's routes (the root layout without a directory), optionally with a serverGuard for everything below it.",
5
+ "description": "Adds a _layout.tsx to a folder of a Rivet app's routes (the root layout without a directory), optionally with a guard(…) export for everything below it.",
6
6
  "type": "object",
7
7
  "properties": {
8
8
  "directory": {
@@ -18,7 +18,7 @@
18
18
  "x-dropdown": "projects",
19
19
  "x-prompt": "Which project?"
20
20
  },
21
- "guard": { "type": "boolean", "default": false, "description": "Add a serverGuard for the whole folder." },
21
+ "guard": { "type": "boolean", "default": false, "description": "Add a guard(…) export for the whole folder." },
22
22
  "skipFormat": { "type": "boolean", "default": false, "x-priority": "internal", "description": "Skip formatting files." }
23
23
  },
24
24
  "required": ["project"],
@@ -1,19 +1,19 @@
1
1
  <% if (routerImports.length) { %>import { <%- routerImports.join(", ") %> } from "@rivetjs/router";
2
2
  <% } %><% if (guard) { %>
3
3
  /** Runs on the server before the loader. Return `redirect()`, `deny()` or `notFound()` to stop the request. */
4
- export const serverGuard = ({ url }: RequestEvent) => {
4
+ export const access = guard(({ url }: RequestEvent) => {
5
5
  if (url.searchParams.has("deny")) return deny();
6
- };
6
+ });
7
7
  <% } %><% if (entries) { %>
8
8
  /** Parameter values to prerender (static mode): one page per entry. */
9
- export const serverEntries = () => [<%- entries %>];
9
+ export const paths = entries(() => [<%- entries %>]);
10
10
  <% } %><% if (loader) { %>
11
11
  /** Data for the page, loaded on the server; removed from the browser build with everything only it uses. */
12
- export const serverLoad = (<% if (params.length) { %>{ params }<% } else { %>_event<% } %>: RequestEvent) => ({
12
+ export const loader = load((<% if (params.length) { %>{ params }<% } else { %>_event<% } %>: RequestEvent) => ({
13
13
  title: <%- loaderTitle %>,
14
- });
14
+ }));
15
15
  <% } %><% if (action) { %>
16
- export const serverActions = {
16
+ export const forms = actions({
17
17
  /** Handles `<form method="post" action="?/save">`. Works without JavaScript. */
18
18
  save: async ({ request, url }: RequestEvent) => {
19
19
  const text = String((await request.formData()).get("text") ?? "").trim();
@@ -21,7 +21,7 @@ export const serverActions = {
21
21
  // Post/redirect/get: reloading the page does not submit the form again.
22
22
  return redirect(url.pathname, 303);
23
23
  },
24
- };
24
+ });
25
25
  <% } %>
26
26
  export const head = { title: "<%= title %>" };
27
27
 
@@ -2,7 +2,7 @@ import { type Tree } from "@nx/devkit";
2
2
  import { routeParams } from "../../utils/project.js";
3
3
  import type { RouteGeneratorSchema } from "./schema.js";
4
4
  export type { RouteGeneratorSchema } from "./schema.js";
5
- /** Sample `serverEntries` value of a route's params (`{ slug: "example" }`), or undefined without required params. */
5
+ /** Sample `entries(…)` value of a route's params (`{ slug: "example" }`), or undefined without required params. */
6
6
  export declare function sampleEntry(params: ReturnType<typeof routeParams>): string | undefined;
7
7
  /** The URL pattern of route segments (`/blog/:slug`). */
8
8
  export declare function routeUrl(segments: string[]): string;
@@ -4,7 +4,7 @@ import { formatFiles, generateFiles, joinPathFragments } from "@nx/devkit";
4
4
  import { routeComponentName, routedApp, routeParams, routeSegments } from "../../utils/project.js";
5
5
  import { layoutGenerator } from "../layout/generator.js";
6
6
  const FILES = fileURLToPath(new URL("./files", import.meta.url));
7
- /** Sample `serverEntries` value of a route's params (`{ slug: "example" }`), or undefined without required params. */
7
+ /** Sample `entries(…)` value of a route's params (`{ slug: "example" }`), or undefined without required params. */
8
8
  export function sampleEntry(params) {
9
9
  const required = params.filter((param) => param.kind !== "optional");
10
10
  if (!required.length)
@@ -26,7 +26,7 @@ export async function routeGenerator(tree, options) {
26
26
  const segments = routeSegments(options.path);
27
27
  const params = routeParams(segments);
28
28
  if (options.action && project.facts?.static)
29
- throw new Error('route: serverActions need a server; this app is prerendered (rivetRouter({ mode: "static" }))');
29
+ throw new Error('route: actions(…) need a server; this app is prerendered (rivetRouter({ mode: "static" }))');
30
30
  const index = !segments.length || /^\(.*\)$/.test(segments.at(-1)) || /(^|\/)index(\.\w+)?\/?$/.test(options.path) || options.path.endsWith("/");
31
31
  const folder = joinPathFragments(project.routes, ...(index ? segments : segments.slice(0, -1)));
32
32
  const fileName = index ? "index" : segments.at(-1);
@@ -37,7 +37,12 @@ export async function routeGenerator(tree, options) {
37
37
  const name = routeComponentName(segments.filter((segment) => !/^\(.*\)$/.test(segment)));
38
38
  const title = name.replace(/([a-z0-9])([A-Z])/g, "$1 $2");
39
39
  const first = params[0];
40
+ const entries = project.facts?.static ? (sampleEntry(params) ?? "") : "";
40
41
  const routerImports = [
42
+ ...(options.guard ? ["guard"] : []),
43
+ ...(entries ? ["entries"] : []),
44
+ ...(options.loader ? ["load"] : []),
45
+ ...(options.action ? ["actions"] : []),
41
46
  ...(options.guard ? ["deny"] : []),
42
47
  ...(options.action ? ["redirect"] : []),
43
48
  ...(options.loader || params.length ? ["type PageProps"] : []),
@@ -54,9 +59,9 @@ export async function routeGenerator(tree, options) {
54
59
  loader: Boolean(options.loader),
55
60
  action: Boolean(options.action),
56
61
  params,
57
- entries: project.facts?.static ? (sampleEntry(params) ?? "") : "",
62
+ entries,
58
63
  loaderTitle: first ? `\`${title}: \${params.${first.name} ?? ""}\`` : JSON.stringify(title),
59
- props: props.length ? `{ ${props.join(", ")} }: PageProps${options.loader ? "<typeof serverLoad>" : ""}` : "",
64
+ props: props.length ? `{ ${props.join(", ")} }: PageProps${options.loader ? "<typeof loader>" : ""}` : "",
60
65
  });
61
66
  if (options.layout && !tree.exists(joinPathFragments(folder, "_layout.tsx"))) {
62
67
  await layoutGenerator(tree, { project: options.project, directory: folder.slice(project.routes.length + 1), skipFormat: true });
@@ -3,11 +3,11 @@ export interface RouteGeneratorSchema {
3
3
  path: string;
4
4
  /** The Rivet app. */
5
5
  project: string;
6
- /** `serverLoad` + typed `data` prop. */
6
+ /** A `load(…)` export (`loader`) + typed `data` prop. */
7
7
  loader?: boolean;
8
- /** `serverActions` + a progressive-enhancement form (node adapter only). */
8
+ /** An `actions(…)` export (`forms`) + a progressive-enhancement form (node adapter only). */
9
9
  action?: boolean;
10
- /** `serverGuard`. */
10
+ /** A `guard(…)` export (`access`). */
11
11
  guard?: boolean;
12
12
  /** Also create a `_layout.tsx` in the route's folder (when it has none). */
13
13
  layout?: boolean;
@@ -2,7 +2,7 @@
2
2
  "$schema": "https://json-schema.org/schema",
3
3
  "$id": "RivetRoute",
4
4
  "title": "Rivet route",
5
- "description": "Adds a file route (page) to a Rivet app: dynamic segments ([param], [[optional]], [...rest]), groups ((name)), optional serverLoad / serverActions / serverGuard and a folder layout.",
5
+ "description": "Adds a file route (page) to a Rivet app: dynamic segments ([param], [[optional]], [...rest]), groups ((name)), optional load(…) / actions(…) / guard(…) exports and a folder layout.",
6
6
  "type": "object",
7
7
  "properties": {
8
8
  "path": {
@@ -18,9 +18,9 @@
18
18
  "x-dropdown": "projects",
19
19
  "x-prompt": "Which project?"
20
20
  },
21
- "loader": { "type": "boolean", "default": false, "description": "Add serverLoad and a typed data prop." },
22
- "action": { "type": "boolean", "default": false, "description": "Add serverActions and a form that posts to it (node adapter only)." },
23
- "guard": { "type": "boolean", "default": false, "description": "Add serverGuard." },
21
+ "loader": { "type": "boolean", "default": false, "description": "Add a load(…) export and a typed data prop." },
22
+ "action": { "type": "boolean", "default": false, "description": "Add an actions(…) export and a form that posts to it (node adapter only)." },
23
+ "guard": { "type": "boolean", "default": false, "description": "Add a guard(…) export." },
24
24
  "layout": { "type": "boolean", "default": false, "description": "Also create _layout.tsx in the route's folder (when it has none)." },
25
25
  "skipFormat": { "type": "boolean", "default": false, "x-priority": "internal", "description": "Skip formatting files." }
26
26
  },
package/generators.json CHANGED
@@ -39,18 +39,18 @@
39
39
  "factory": "./generators/route/generator",
40
40
  "schema": "./generators/route/schema.json",
41
41
  "aliases": ["r", "page"],
42
- "description": "Add a file route: dynamic segments, serverLoad, serverActions, serverGuard, folder layout."
42
+ "description": "Add a file route: dynamic segments, load(…) / actions(…) / guard(…) exports, folder layout."
43
43
  },
44
44
  "layout": {
45
45
  "factory": "./generators/layout/generator",
46
46
  "schema": "./generators/layout/schema.json",
47
- "description": "Add a _layout.tsx to a routes folder (optional serverGuard)."
47
+ "description": "Add a _layout.tsx to a routes folder (optional guard(…) export)."
48
48
  },
49
49
  "api-route": {
50
50
  "factory": "./generators/api-route/generator",
51
51
  "schema": "./generators/api-route/schema.json",
52
52
  "aliases": ["endpoint"],
53
- "description": "Add an endpoint route (onGet / onPost / … request handlers)."
53
+ "description": "Add an endpoint route (onGet(…) / onPost(…) / … request handler exports)."
54
54
  },
55
55
  "ui-setup": {
56
56
  "factory": "./generators/ui-setup/generator",
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@rivetjs/nx",
3
- "version": "0.1.0-alpha.0",
3
+ "version": "0.1.0-alpha.2",
4
4
  "license": "MIT",
5
5
  "type": "module",
6
6
  "description": "Nx plugin for Rivet: generators, executors and inferred tasks for Rivet apps and libraries.",
@@ -38,7 +38,7 @@
38
38
  },
39
39
  "dependencies": {
40
40
  "@nx/devkit": "23.2.1",
41
- "create-rivet": "0.1.0-alpha.0"
41
+ "create-rivet": "0.1.0-alpha.2"
42
42
  },
43
43
  "peerDependencies": {
44
44
  "nx": ">=23 <24"