@inertiajs/core 2.1.1 → 2.1.3

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.
@@ -1,8 +1,8 @@
1
1
  // src/server.ts
2
2
  import { createServer } from "http";
3
- import * as process from "process";
4
3
  import cluster from "node:cluster";
5
4
  import { availableParallelism } from "node:os";
5
+ import * as process from "process";
6
6
  var readableToString = (readable) => new Promise((resolve, reject) => {
7
7
  let data = "";
8
8
  readable.on("data", (chunk) => data += chunk);
@@ -13,7 +13,9 @@ var server_default = (render, options) => {
13
13
  const _port = typeof options === "number" ? options : options?.port ?? 13714;
14
14
  const _useCluster = typeof options === "object" && options?.cluster !== void 0 ? options.cluster : false;
15
15
  const log = (message) => {
16
- console.log(_useCluster && !cluster.isPrimary ? `[${cluster.worker?.id ?? "N/A"} / ${cluster.worker?.process?.pid ?? "N/A"}] ${message}` : message);
16
+ console.log(
17
+ _useCluster && !cluster.isPrimary ? `[${cluster.worker?.id ?? "N/A"} / ${cluster.worker?.process?.pid ?? "N/A"}] ${message}` : message
18
+ );
17
19
  };
18
20
  if (_useCluster && cluster.isPrimary) {
19
21
  log("Primary Inertia SSR server process started...");
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../src/server.ts"],
4
- "sourcesContent": ["import { createServer, IncomingMessage } from 'http'\nimport * as process from 'process'\nimport { InertiaAppResponse, Page } from './types'\nimport cluster from 'node:cluster';\nimport { availableParallelism } from 'node:os';\n\ntype AppCallback = (page: Page) => InertiaAppResponse\ntype RouteHandler = (request: IncomingMessage) => Promise<unknown>\ntype ServerOptions = {\n port?: number\n cluster?: boolean\n}\ntype Port = number\n\nconst readableToString: (readable: IncomingMessage) => Promise<string> = (readable) =>\n new Promise((resolve, reject) => {\n let data = ''\n readable.on('data', (chunk) => (data += chunk))\n readable.on('end', () => resolve(data))\n readable.on('error', (err) => reject(err))\n })\n\nexport default (render: AppCallback, options?: Port | ServerOptions): void => {\n const _port = typeof options === 'number' ? options : options?.port ?? 13714;\n const _useCluster = typeof options === 'object' && options?.cluster !== undefined ? options.cluster : false;\n\n const log = (message: string) => {\n console.log(_useCluster && !cluster.isPrimary ? `[${cluster.worker?.id ?? 'N/A'} / ${cluster.worker?.process?.pid ?? 'N/A'}] ${message}` : message)\n }\n\n if (_useCluster && cluster.isPrimary) {\n log('Primary Inertia SSR server process started...')\n\n for (let i = 0; i < availableParallelism(); i++) {\n cluster.fork()\n }\n\n return\n }\n\n const routes: Record<string, RouteHandler> = {\n '/health': async () => ({ status: 'OK', timestamp: Date.now() }),\n '/shutdown': () => process.exit(),\n '/render': async (request) => render(JSON.parse(await readableToString(request))),\n '/404': async () => ({ status: 'NOT_FOUND', timestamp: Date.now() }),\n }\n\n createServer(async (request, response) => {\n const dispatchRoute = routes[<string>request.url] || routes['/404']\n\n try {\n response.writeHead(200, { 'Content-Type': 'application/json', Server: 'Inertia.js SSR' })\n response.write(JSON.stringify(await dispatchRoute(request)))\n } catch (e) {\n console.error(e)\n }\n\n response.end()\n }).listen(_port, () => log('Inertia SSR server started.'))\n\n log(`Starting SSR server on port ${_port}...`)\n}\n"],
5
- "mappings": ";AAAA,SAAS,oBAAqC;AAC9C,YAAY,aAAa;AAEzB,OAAO,aAAa;AACpB,SAAS,4BAA4B;AAUrC,IAAM,mBAAmE,CAAC,aACxE,IAAI,QAAQ,CAAC,SAAS,WAAW;AAC/B,MAAI,OAAO;AACX,WAAS,GAAG,QAAQ,CAAC,UAAW,QAAQ,KAAM;AAC9C,WAAS,GAAG,OAAO,MAAM,QAAQ,IAAI,CAAC;AACtC,WAAS,GAAG,SAAS,CAAC,QAAQ,OAAO,GAAG,CAAC;AAC3C,CAAC;AAEH,IAAO,iBAAQ,CAAC,QAAqB,YAAyC;AAC5E,QAAM,QAAQ,OAAO,YAAY,WAAW,UAAU,SAAS,QAAQ;AACvE,QAAM,cAAc,OAAO,YAAY,YAAY,SAAS,YAAY,SAAY,QAAQ,UAAU;AAEtG,QAAM,MAAM,CAAC,YAAoB;AAC/B,YAAQ,IAAI,eAAe,CAAC,QAAQ,YAAY,IAAI,QAAQ,QAAQ,MAAM,KAAK,MAAM,QAAQ,QAAQ,SAAS,OAAO,KAAK,KAAK,OAAO,KAAK,OAAO;AAAA,EACpJ;AAEA,MAAI,eAAe,QAAQ,WAAW;AACpC,QAAI,+CAA+C;AAEnD,aAAS,IAAI,GAAG,IAAI,qBAAqB,GAAG,KAAK;AAC/C,cAAQ,KAAK;AAAA,IACf;AAEA;AAAA,EACF;AAEA,QAAM,SAAuC;AAAA,IAC3C,WAAW,aAAa,EAAE,QAAQ,MAAM,WAAW,KAAK,IAAI,EAAE;AAAA,IAC9D,aAAa,MAAc,aAAK;AAAA,IAChC,WAAW,OAAO,YAAY,OAAO,KAAK,MAAM,MAAM,iBAAiB,OAAO,CAAC,CAAC;AAAA,IAChF,QAAQ,aAAa,EAAE,QAAQ,aAAa,WAAW,KAAK,IAAI,EAAE;AAAA,EACpE;AAEA,eAAa,OAAO,SAAS,aAAa;AACxC,UAAM,gBAAgB,OAAe,QAAQ,GAAG,KAAK,OAAO,MAAM;AAElE,QAAI;AACF,eAAS,UAAU,KAAK,EAAE,gBAAgB,oBAAoB,QAAQ,iBAAiB,CAAC;AACxF,eAAS,MAAM,KAAK,UAAU,MAAM,cAAc,OAAO,CAAC,CAAC;AAAA,IAC7D,SAAS,GAAG;AACV,cAAQ,MAAM,CAAC;AAAA,IACjB;AAEA,aAAS,IAAI;AAAA,EACf,CAAC,EAAE,OAAO,OAAO,MAAM,IAAI,6BAA6B,CAAC;AAEzD,MAAI,+BAA+B,KAAK,KAAK;AAC/C;",
4
+ "sourcesContent": ["import { createServer, IncomingMessage } from 'http'\nimport cluster from 'node:cluster'\nimport { availableParallelism } from 'node:os'\nimport * as process from 'process'\nimport { InertiaAppResponse, Page } from './types'\n\ntype AppCallback = (page: Page) => InertiaAppResponse\ntype RouteHandler = (request: IncomingMessage) => Promise<unknown>\ntype ServerOptions = {\n port?: number\n cluster?: boolean\n}\ntype Port = number\n\nconst readableToString: (readable: IncomingMessage) => Promise<string> = (readable) =>\n new Promise((resolve, reject) => {\n let data = ''\n readable.on('data', (chunk) => (data += chunk))\n readable.on('end', () => resolve(data))\n readable.on('error', (err) => reject(err))\n })\n\nexport default (render: AppCallback, options?: Port | ServerOptions): void => {\n const _port = typeof options === 'number' ? options : (options?.port ?? 13714)\n const _useCluster = typeof options === 'object' && options?.cluster !== undefined ? options.cluster : false\n\n const log = (message: string) => {\n console.log(\n _useCluster && !cluster.isPrimary\n ? `[${cluster.worker?.id ?? 'N/A'} / ${cluster.worker?.process?.pid ?? 'N/A'}] ${message}`\n : message,\n )\n }\n\n if (_useCluster && cluster.isPrimary) {\n log('Primary Inertia SSR server process started...')\n\n for (let i = 0; i < availableParallelism(); i++) {\n cluster.fork()\n }\n\n return\n }\n\n const routes: Record<string, RouteHandler> = {\n '/health': async () => ({ status: 'OK', timestamp: Date.now() }),\n '/shutdown': () => process.exit(),\n '/render': async (request) => render(JSON.parse(await readableToString(request))),\n '/404': async () => ({ status: 'NOT_FOUND', timestamp: Date.now() }),\n }\n\n createServer(async (request, response) => {\n const dispatchRoute = routes[<string>request.url] || routes['/404']\n\n try {\n response.writeHead(200, { 'Content-Type': 'application/json', Server: 'Inertia.js SSR' })\n response.write(JSON.stringify(await dispatchRoute(request)))\n } catch (e) {\n console.error(e)\n }\n\n response.end()\n }).listen(_port, () => log('Inertia SSR server started.'))\n\n log(`Starting SSR server on port ${_port}...`)\n}\n"],
5
+ "mappings": ";AAAA,SAAS,oBAAqC;AAC9C,OAAO,aAAa;AACpB,SAAS,4BAA4B;AACrC,YAAY,aAAa;AAWzB,IAAM,mBAAmE,CAAC,aACxE,IAAI,QAAQ,CAAC,SAAS,WAAW;AAC/B,MAAI,OAAO;AACX,WAAS,GAAG,QAAQ,CAAC,UAAW,QAAQ,KAAM;AAC9C,WAAS,GAAG,OAAO,MAAM,QAAQ,IAAI,CAAC;AACtC,WAAS,GAAG,SAAS,CAAC,QAAQ,OAAO,GAAG,CAAC;AAC3C,CAAC;AAEH,IAAO,iBAAQ,CAAC,QAAqB,YAAyC;AAC5E,QAAM,QAAQ,OAAO,YAAY,WAAW,UAAW,SAAS,QAAQ;AACxE,QAAM,cAAc,OAAO,YAAY,YAAY,SAAS,YAAY,SAAY,QAAQ,UAAU;AAEtG,QAAM,MAAM,CAAC,YAAoB;AAC/B,YAAQ;AAAA,MACN,eAAe,CAAC,QAAQ,YACpB,IAAI,QAAQ,QAAQ,MAAM,KAAK,MAAM,QAAQ,QAAQ,SAAS,OAAO,KAAK,KAAK,OAAO,KACtF;AAAA,IACN;AAAA,EACF;AAEA,MAAI,eAAe,QAAQ,WAAW;AACpC,QAAI,+CAA+C;AAEnD,aAAS,IAAI,GAAG,IAAI,qBAAqB,GAAG,KAAK;AAC/C,cAAQ,KAAK;AAAA,IACf;AAEA;AAAA,EACF;AAEA,QAAM,SAAuC;AAAA,IAC3C,WAAW,aAAa,EAAE,QAAQ,MAAM,WAAW,KAAK,IAAI,EAAE;AAAA,IAC9D,aAAa,MAAc,aAAK;AAAA,IAChC,WAAW,OAAO,YAAY,OAAO,KAAK,MAAM,MAAM,iBAAiB,OAAO,CAAC,CAAC;AAAA,IAChF,QAAQ,aAAa,EAAE,QAAQ,aAAa,WAAW,KAAK,IAAI,EAAE;AAAA,EACpE;AAEA,eAAa,OAAO,SAAS,aAAa;AACxC,UAAM,gBAAgB,OAAe,QAAQ,GAAG,KAAK,OAAO,MAAM;AAElE,QAAI;AACF,eAAS,UAAU,KAAK,EAAE,gBAAgB,oBAAoB,QAAQ,iBAAiB,CAAC;AACxF,eAAS,MAAM,KAAK,UAAU,MAAM,cAAc,OAAO,CAAC,CAAC;AAAA,IAC7D,SAAS,GAAG;AACV,cAAQ,MAAM,CAAC;AAAA,IACjB;AAEA,aAAS,IAAI;AAAA,EACf,CAAC,EAAE,OAAO,OAAO,MAAM,IAAI,6BAA6B,CAAC;AAEzD,MAAI,+BAA+B,KAAK,KAAK;AAC/C;",
6
6
  "names": []
7
7
  }
package/dist/server.js CHANGED
@@ -34,9 +34,9 @@ __export(server_exports, {
34
34
  });
35
35
  module.exports = __toCommonJS(server_exports);
36
36
  var import_http = require("http");
37
- var process = __toESM(require("process"), 1);
38
37
  var import_node_cluster = __toESM(require("node:cluster"), 1);
39
38
  var import_node_os = require("node:os");
39
+ var process = __toESM(require("process"), 1);
40
40
  var readableToString = (readable) => new Promise((resolve, reject) => {
41
41
  let data = "";
42
42
  readable.on("data", (chunk) => data += chunk);
@@ -47,7 +47,9 @@ var server_default = (render, options) => {
47
47
  const _port = typeof options === "number" ? options : options?.port ?? 13714;
48
48
  const _useCluster = typeof options === "object" && options?.cluster !== void 0 ? options.cluster : false;
49
49
  const log = (message) => {
50
- console.log(_useCluster && !import_node_cluster.default.isPrimary ? `[${import_node_cluster.default.worker?.id ?? "N/A"} / ${import_node_cluster.default.worker?.process?.pid ?? "N/A"}] ${message}` : message);
50
+ console.log(
51
+ _useCluster && !import_node_cluster.default.isPrimary ? `[${import_node_cluster.default.worker?.id ?? "N/A"} / ${import_node_cluster.default.worker?.process?.pid ?? "N/A"}] ${message}` : message
52
+ );
51
53
  };
52
54
  if (_useCluster && import_node_cluster.default.isPrimary) {
53
55
  log("Primary Inertia SSR server process started...");
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../src/server.ts"],
4
- "sourcesContent": ["import { createServer, IncomingMessage } from 'http'\nimport * as process from 'process'\nimport { InertiaAppResponse, Page } from './types'\nimport cluster from 'node:cluster';\nimport { availableParallelism } from 'node:os';\n\ntype AppCallback = (page: Page) => InertiaAppResponse\ntype RouteHandler = (request: IncomingMessage) => Promise<unknown>\ntype ServerOptions = {\n port?: number\n cluster?: boolean\n}\ntype Port = number\n\nconst readableToString: (readable: IncomingMessage) => Promise<string> = (readable) =>\n new Promise((resolve, reject) => {\n let data = ''\n readable.on('data', (chunk) => (data += chunk))\n readable.on('end', () => resolve(data))\n readable.on('error', (err) => reject(err))\n })\n\nexport default (render: AppCallback, options?: Port | ServerOptions): void => {\n const _port = typeof options === 'number' ? options : options?.port ?? 13714;\n const _useCluster = typeof options === 'object' && options?.cluster !== undefined ? options.cluster : false;\n\n const log = (message: string) => {\n console.log(_useCluster && !cluster.isPrimary ? `[${cluster.worker?.id ?? 'N/A'} / ${cluster.worker?.process?.pid ?? 'N/A'}] ${message}` : message)\n }\n\n if (_useCluster && cluster.isPrimary) {\n log('Primary Inertia SSR server process started...')\n\n for (let i = 0; i < availableParallelism(); i++) {\n cluster.fork()\n }\n\n return\n }\n\n const routes: Record<string, RouteHandler> = {\n '/health': async () => ({ status: 'OK', timestamp: Date.now() }),\n '/shutdown': () => process.exit(),\n '/render': async (request) => render(JSON.parse(await readableToString(request))),\n '/404': async () => ({ status: 'NOT_FOUND', timestamp: Date.now() }),\n }\n\n createServer(async (request, response) => {\n const dispatchRoute = routes[<string>request.url] || routes['/404']\n\n try {\n response.writeHead(200, { 'Content-Type': 'application/json', Server: 'Inertia.js SSR' })\n response.write(JSON.stringify(await dispatchRoute(request)))\n } catch (e) {\n console.error(e)\n }\n\n response.end()\n }).listen(_port, () => log('Inertia SSR server started.'))\n\n log(`Starting SSR server on port ${_port}...`)\n}\n"],
5
- "mappings": ";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,kBAA8C;AAC9C,cAAyB;AAEzB,0BAAoB;AACpB,qBAAqC;AAUrC,IAAM,mBAAmE,CAAC,aACxE,IAAI,QAAQ,CAAC,SAAS,WAAW;AAC/B,MAAI,OAAO;AACX,WAAS,GAAG,QAAQ,CAAC,UAAW,QAAQ,KAAM;AAC9C,WAAS,GAAG,OAAO,MAAM,QAAQ,IAAI,CAAC;AACtC,WAAS,GAAG,SAAS,CAAC,QAAQ,OAAO,GAAG,CAAC;AAC3C,CAAC;AAEH,IAAO,iBAAQ,CAAC,QAAqB,YAAyC;AAC5E,QAAM,QAAQ,OAAO,YAAY,WAAW,UAAU,SAAS,QAAQ;AACvE,QAAM,cAAc,OAAO,YAAY,YAAY,SAAS,YAAY,SAAY,QAAQ,UAAU;AAEtG,QAAM,MAAM,CAAC,YAAoB;AAC/B,YAAQ,IAAI,eAAe,CAAC,oBAAAA,QAAQ,YAAY,IAAI,oBAAAA,QAAQ,QAAQ,MAAM,KAAK,MAAM,oBAAAA,QAAQ,QAAQ,SAAS,OAAO,KAAK,KAAK,OAAO,KAAK,OAAO;AAAA,EACpJ;AAEA,MAAI,eAAe,oBAAAA,QAAQ,WAAW;AACpC,QAAI,+CAA+C;AAEnD,aAAS,IAAI,GAAG,QAAI,qCAAqB,GAAG,KAAK;AAC/C,0BAAAA,QAAQ,KAAK;AAAA,IACf;AAEA;AAAA,EACF;AAEA,QAAM,SAAuC;AAAA,IAC3C,WAAW,aAAa,EAAE,QAAQ,MAAM,WAAW,KAAK,IAAI,EAAE;AAAA,IAC9D,aAAa,MAAc,aAAK;AAAA,IAChC,WAAW,OAAO,YAAY,OAAO,KAAK,MAAM,MAAM,iBAAiB,OAAO,CAAC,CAAC;AAAA,IAChF,QAAQ,aAAa,EAAE,QAAQ,aAAa,WAAW,KAAK,IAAI,EAAE;AAAA,EACpE;AAEA,gCAAa,OAAO,SAAS,aAAa;AACxC,UAAM,gBAAgB,OAAe,QAAQ,GAAG,KAAK,OAAO,MAAM;AAElE,QAAI;AACF,eAAS,UAAU,KAAK,EAAE,gBAAgB,oBAAoB,QAAQ,iBAAiB,CAAC;AACxF,eAAS,MAAM,KAAK,UAAU,MAAM,cAAc,OAAO,CAAC,CAAC;AAAA,IAC7D,SAAS,GAAG;AACV,cAAQ,MAAM,CAAC;AAAA,IACjB;AAEA,aAAS,IAAI;AAAA,EACf,CAAC,EAAE,OAAO,OAAO,MAAM,IAAI,6BAA6B,CAAC;AAEzD,MAAI,+BAA+B,KAAK,KAAK;AAC/C;",
4
+ "sourcesContent": ["import { createServer, IncomingMessage } from 'http'\nimport cluster from 'node:cluster'\nimport { availableParallelism } from 'node:os'\nimport * as process from 'process'\nimport { InertiaAppResponse, Page } from './types'\n\ntype AppCallback = (page: Page) => InertiaAppResponse\ntype RouteHandler = (request: IncomingMessage) => Promise<unknown>\ntype ServerOptions = {\n port?: number\n cluster?: boolean\n}\ntype Port = number\n\nconst readableToString: (readable: IncomingMessage) => Promise<string> = (readable) =>\n new Promise((resolve, reject) => {\n let data = ''\n readable.on('data', (chunk) => (data += chunk))\n readable.on('end', () => resolve(data))\n readable.on('error', (err) => reject(err))\n })\n\nexport default (render: AppCallback, options?: Port | ServerOptions): void => {\n const _port = typeof options === 'number' ? options : (options?.port ?? 13714)\n const _useCluster = typeof options === 'object' && options?.cluster !== undefined ? options.cluster : false\n\n const log = (message: string) => {\n console.log(\n _useCluster && !cluster.isPrimary\n ? `[${cluster.worker?.id ?? 'N/A'} / ${cluster.worker?.process?.pid ?? 'N/A'}] ${message}`\n : message,\n )\n }\n\n if (_useCluster && cluster.isPrimary) {\n log('Primary Inertia SSR server process started...')\n\n for (let i = 0; i < availableParallelism(); i++) {\n cluster.fork()\n }\n\n return\n }\n\n const routes: Record<string, RouteHandler> = {\n '/health': async () => ({ status: 'OK', timestamp: Date.now() }),\n '/shutdown': () => process.exit(),\n '/render': async (request) => render(JSON.parse(await readableToString(request))),\n '/404': async () => ({ status: 'NOT_FOUND', timestamp: Date.now() }),\n }\n\n createServer(async (request, response) => {\n const dispatchRoute = routes[<string>request.url] || routes['/404']\n\n try {\n response.writeHead(200, { 'Content-Type': 'application/json', Server: 'Inertia.js SSR' })\n response.write(JSON.stringify(await dispatchRoute(request)))\n } catch (e) {\n console.error(e)\n }\n\n response.end()\n }).listen(_port, () => log('Inertia SSR server started.'))\n\n log(`Starting SSR server on port ${_port}...`)\n}\n"],
5
+ "mappings": ";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,kBAA8C;AAC9C,0BAAoB;AACpB,qBAAqC;AACrC,cAAyB;AAWzB,IAAM,mBAAmE,CAAC,aACxE,IAAI,QAAQ,CAAC,SAAS,WAAW;AAC/B,MAAI,OAAO;AACX,WAAS,GAAG,QAAQ,CAAC,UAAW,QAAQ,KAAM;AAC9C,WAAS,GAAG,OAAO,MAAM,QAAQ,IAAI,CAAC;AACtC,WAAS,GAAG,SAAS,CAAC,QAAQ,OAAO,GAAG,CAAC;AAC3C,CAAC;AAEH,IAAO,iBAAQ,CAAC,QAAqB,YAAyC;AAC5E,QAAM,QAAQ,OAAO,YAAY,WAAW,UAAW,SAAS,QAAQ;AACxE,QAAM,cAAc,OAAO,YAAY,YAAY,SAAS,YAAY,SAAY,QAAQ,UAAU;AAEtG,QAAM,MAAM,CAAC,YAAoB;AAC/B,YAAQ;AAAA,MACN,eAAe,CAAC,oBAAAA,QAAQ,YACpB,IAAI,oBAAAA,QAAQ,QAAQ,MAAM,KAAK,MAAM,oBAAAA,QAAQ,QAAQ,SAAS,OAAO,KAAK,KAAK,OAAO,KACtF;AAAA,IACN;AAAA,EACF;AAEA,MAAI,eAAe,oBAAAA,QAAQ,WAAW;AACpC,QAAI,+CAA+C;AAEnD,aAAS,IAAI,GAAG,QAAI,qCAAqB,GAAG,KAAK;AAC/C,0BAAAA,QAAQ,KAAK;AAAA,IACf;AAEA;AAAA,EACF;AAEA,QAAM,SAAuC;AAAA,IAC3C,WAAW,aAAa,EAAE,QAAQ,MAAM,WAAW,KAAK,IAAI,EAAE;AAAA,IAC9D,aAAa,MAAc,aAAK;AAAA,IAChC,WAAW,OAAO,YAAY,OAAO,KAAK,MAAM,MAAM,iBAAiB,OAAO,CAAC,CAAC;AAAA,IAChF,QAAQ,aAAa,EAAE,QAAQ,aAAa,WAAW,KAAK,IAAI,EAAE;AAAA,EACpE;AAEA,gCAAa,OAAO,SAAS,aAAa;AACxC,UAAM,gBAAgB,OAAe,QAAQ,GAAG,KAAK,OAAO,MAAM;AAElE,QAAI;AACF,eAAS,UAAU,KAAK,EAAE,gBAAgB,oBAAoB,QAAQ,iBAAiB,CAAC;AACxF,eAAS,MAAM,KAAK,UAAU,MAAM,cAAc,OAAO,CAAC,CAAC;AAAA,IAC7D,SAAS,GAAG;AACV,cAAQ,MAAM,CAAC;AAAA,IACjB;AAEA,aAAS,IAAI;AAAA,EACf,CAAC,EAAE,OAAO,OAAO,MAAM,IAAI,6BAA6B,CAAC;AAEzD,MAAI,+BAA+B,KAAK,KAAK;AAC/C;",
6
6
  "names": ["cluster"]
7
7
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@inertiajs/core",
3
- "version": "2.1.1",
3
+ "version": "2.1.3",
4
4
  "license": "MIT",
5
5
  "description": "A framework for creating server-driven single page apps.",
6
6
  "contributors": [
@@ -44,8 +44,9 @@
44
44
  }
45
45
  },
46
46
  "dependencies": {
47
- "axios": "^1.8.2",
48
- "es-toolkit": "^1.34.1",
47
+ "@types/lodash-es": "^4.17.12",
48
+ "axios": "^1.11.0",
49
+ "lodash-es": "^4.17.21",
49
50
  "qs": "^6.9.0"
50
51
  },
51
52
  "devDependencies": {
@@ -53,13 +54,16 @@
53
54
  "@types/node": "^18.4",
54
55
  "@types/nprogress": "^0.2.0",
55
56
  "@types/qs": "^6.9.0",
57
+ "es-check": "^9.3.1",
56
58
  "esbuild": "^0.25.0",
57
59
  "esbuild-node-externals": "^1.6.0",
58
60
  "typescript": "^4.9.4"
59
61
  },
60
62
  "scripts": {
63
+ "build": "pnpm clean && ./build.js && tsc",
64
+ "build:with-deps": "./build.js --with-deps",
65
+ "clean": "rm -rf types && rm -rf dist",
61
66
  "dev": "./build.js --watch",
62
- "build": "pnpm clean && ./build.js && tsc --emitDeclarationOnly",
63
- "clean": "rm -rf types && rm -rf dist"
67
+ "es2020-check": "pnpm build:with-deps && es-check es2020 \"dist/index.esm.js\" --checkFeatures --module --noCache --verbose"
64
68
  }
65
69
  }
package/types/index.d.ts CHANGED
@@ -1,11 +1,11 @@
1
1
  import { Router } from './router';
2
2
  export { objectToFormData } from './formData';
3
3
  export { formDataToObject } from './formObject';
4
- export { resetFormFields } from './resetFormFields';
5
4
  export { default as createHeadManager } from './head';
5
+ export { shouldIntercept, shouldNavigate } from './navigationEvents';
6
6
  export { hide as hideProgress, reveal as revealProgress, default as setupProgress } from './progress';
7
- export { default as shouldIntercept } from './shouldIntercept';
7
+ export { resetFormFields } from './resetFormFields';
8
8
  export * from './types';
9
- export { hrefToUrl, mergeDataIntoQueryString, urlWithoutHash } from './url';
9
+ export { hrefToUrl, isUrlMethodPair, mergeDataIntoQueryString, urlWithoutHash } from './url';
10
10
  export { type Router };
11
11
  export declare const router: Router;
@@ -0,0 +1,12 @@
1
+ /**
2
+ * Determine if this mouse event should be intercepted for navigation purposes.
3
+ * Links with modifier keys or non-left clicks should not be intercepted.
4
+ * Content editable elements and prevented events are ignored.
5
+ */
6
+ export declare function shouldIntercept(event: Pick<MouseEvent, 'altKey' | 'ctrlKey' | 'defaultPrevented' | 'target' | 'currentTarget' | 'metaKey' | 'shiftKey' | 'button'>): boolean;
7
+ /**
8
+ * Determine if this keyboard event should trigger a navigation request.
9
+ * Enter triggers navigation for both links and buttons currently.
10
+ * Space only triggers navigation for buttons specifically.
11
+ */
12
+ export declare function shouldNavigate(event: Pick<KeyboardEvent, 'key' | 'currentTarget'>): boolean;
@@ -5,8 +5,9 @@ declare class PrefetchedRequests {
5
5
  protected inFlightRequests: InFlightPrefetch[];
6
6
  protected removalTimers: PrefetchRemovalTimer[];
7
7
  protected currentUseId: string | null;
8
- add(params: ActiveVisit, sendFunc: (params: InternalActiveVisit) => void, { cacheFor }: PrefetchOptions): Promise<void> | Promise<Response>;
8
+ add(params: ActiveVisit, sendFunc: (params: InternalActiveVisit) => void, { cacheFor, cacheTags }: PrefetchOptions): Promise<void> | Promise<Response>;
9
9
  removeAll(): void;
10
+ removeByTags(tags: string[]): void;
10
11
  remove(params: ActiveVisit): void;
11
12
  protected removeFromInFlight(params: ActiveVisit): void;
12
13
  protected extractStaleValues(cacheFor: PrefetchOptions['cacheFor']): [number, number];
package/types/router.d.ts CHANGED
@@ -1,14 +1,14 @@
1
1
  import { RequestStream } from './requestStream';
2
- import { ActiveVisit, ClientSideVisitOptions, Component, GlobalEvent, GlobalEventNames, GlobalEventResult, InFlightPrefetch, Page, PendingVisit, PendingVisitOptions, PollOptions, PrefetchedResponse, PrefetchOptions, ReloadOptions, RequestPayload, RouterInitParams, Visit, VisitCallbacks, VisitHelperOptions, VisitOptions } from './types';
2
+ import { ActiveVisit, ClientSideVisitOptions, Component, GlobalEvent, GlobalEventNames, GlobalEventResult, InFlightPrefetch, Page, PendingVisit, PendingVisitOptions, PollOptions, PrefetchedResponse, PrefetchOptions, ReloadOptions, RequestPayload, RouterInitParams, UrlMethodPair, VisitCallbacks, VisitHelperOptions, VisitOptions } from './types';
3
3
  export declare class Router {
4
4
  protected syncRequestStream: RequestStream;
5
5
  protected asyncRequestStream: RequestStream;
6
6
  init({ initialPage, resolveComponent, swapComponent }: RouterInitParams): void;
7
- get<T extends RequestPayload = RequestPayload>(url: URL | string, data?: T, options?: VisitHelperOptions<T>): void;
8
- post<T extends RequestPayload = RequestPayload>(url: URL | string, data?: T, options?: VisitHelperOptions<T>): void;
9
- put<T extends RequestPayload = RequestPayload>(url: URL | string, data?: T, options?: VisitHelperOptions<T>): void;
10
- patch<T extends RequestPayload = RequestPayload>(url: URL | string, data?: T, options?: VisitHelperOptions<T>): void;
11
- delete<T extends RequestPayload = RequestPayload>(url: URL | string, options?: Omit<VisitOptions<T>, 'method'>): void;
7
+ get<T extends RequestPayload = RequestPayload>(url: URL | string | UrlMethodPair, data?: T, options?: VisitHelperOptions<T>): void;
8
+ post<T extends RequestPayload = RequestPayload>(url: URL | string | UrlMethodPair, data?: T, options?: VisitHelperOptions<T>): void;
9
+ put<T extends RequestPayload = RequestPayload>(url: URL | string | UrlMethodPair, data?: T, options?: VisitHelperOptions<T>): void;
10
+ patch<T extends RequestPayload = RequestPayload>(url: URL | string | UrlMethodPair, data?: T, options?: VisitHelperOptions<T>): void;
11
+ delete<T extends RequestPayload = RequestPayload>(url: URL | string | UrlMethodPair, options?: Omit<VisitOptions<T>, 'method'>): void;
12
12
  reload<T extends RequestPayload = RequestPayload>(options?: ReloadOptions<T>): void;
13
13
  remember(data: unknown, key?: string): void;
14
14
  restore(key?: string): unknown;
@@ -19,12 +19,13 @@ export declare class Router {
19
19
  stop: VoidFunction;
20
20
  start: VoidFunction;
21
21
  };
22
- visit<T extends RequestPayload = RequestPayload>(href: string | URL, options?: VisitOptions<T>): void;
23
- getCached(href: string | URL, options?: VisitOptions): InFlightPrefetch | PrefetchedResponse | null;
24
- flush(href: string | URL, options?: VisitOptions): void;
22
+ visit<T extends RequestPayload = RequestPayload>(href: string | URL | UrlMethodPair, options?: VisitOptions<T>): void;
23
+ getCached(href: string | URL | UrlMethodPair, options?: VisitOptions): InFlightPrefetch | PrefetchedResponse | null;
24
+ flush(href: string | URL | UrlMethodPair, options?: VisitOptions): void;
25
25
  flushAll(): void;
26
- getPrefetching(href: string | URL, options?: VisitOptions): InFlightPrefetch | PrefetchedResponse | null;
27
- prefetch(href: string | URL, options: Partial<Visit<RequestPayload> & VisitCallbacks<RequestPayload>> | undefined, { cacheFor }: PrefetchOptions): void;
26
+ flushByCacheTags(tags: string | string[]): void;
27
+ getPrefetching(href: string | URL | UrlMethodPair, options?: VisitOptions): InFlightPrefetch | PrefetchedResponse | null;
28
+ prefetch(href: string | URL | UrlMethodPair, options?: VisitOptions, prefetchOptions?: Partial<PrefetchOptions>): void;
28
29
  clearHistory(): void;
29
30
  decryptHistory(): Promise<Page>;
30
31
  resolveComponent(component: string): Promise<Component>;
@@ -33,8 +34,8 @@ export declare class Router {
33
34
  protected clientVisit<TProps = Page['props']>(params: ClientSideVisitOptions<TProps>, { replace }?: {
34
35
  replace?: boolean;
35
36
  }): void;
36
- protected getPrefetchParams(href: string | URL, options: VisitOptions): ActiveVisit;
37
- protected getPendingVisit(href: string | URL, options: VisitOptions, pendingVisitOptions?: Partial<PendingVisitOptions>): PendingVisit;
37
+ protected getPrefetchParams(href: string | URL | UrlMethodPair, options: VisitOptions): ActiveVisit;
38
+ protected getPendingVisit(href: string | URL | UrlMethodPair, options: VisitOptions, pendingVisitOptions?: Partial<PendingVisitOptions>): PendingVisit;
38
39
  protected getVisitEvents(options: VisitOptions): VisitCallbacks;
39
40
  protected loadDeferredProps(): void;
40
41
  }
package/types/types.d.ts CHANGED
@@ -33,7 +33,7 @@ export type FormDataConvertible = Array<FormDataConvertible> | {
33
33
  [key: string]: FormDataConvertible;
34
34
  } | FormDataConvertibleValue;
35
35
  export type FormDataType<T extends object> = {
36
- [K in keyof T]: T[K] extends FormDataConvertibleValue ? T[K] : T[K] extends (...args: unknown[]) => unknown ? never : T[K] extends object | Array<unknown> ? FormDataType<T[K]> : never;
36
+ [K in keyof T]: T[K] extends infer U ? U extends FormDataConvertibleValue ? U : U extends (...args: unknown[]) => unknown ? never : U extends object | Array<unknown> ? FormDataType<U> : never : never;
37
37
  };
38
38
  export type FormDataKeys<T> = T extends Function | FormDataConvertibleValue ? never : T extends Array<unknown> ? number extends T['length'] ? `${number}` | `${number}.${FormDataKeys<T[number]>}` : Extract<keyof T, `${number}`> | {
39
39
  [Key in Extract<keyof T, `${number}`>]: `${Key & string}.${FormDataKeys<T[Key & string]> & string}`;
@@ -116,6 +116,7 @@ export type Visit<T extends RequestPayload = RequestPayload> = {
116
116
  fresh: boolean;
117
117
  reset: string[];
118
118
  preserveUrl: boolean;
119
+ invalidateCacheTags: string | string[];
119
120
  };
120
121
  export type GlobalEventsMap<T extends RequestPayload = RequestPayload> = {
121
122
  before: {
@@ -262,15 +263,14 @@ export type LinkPrefetchOption = 'mount' | 'hover' | 'click';
262
263
  export type CacheForOption = number | string;
263
264
  export type PrefetchOptions = {
264
265
  cacheFor: CacheForOption | CacheForOption[];
266
+ cacheTags: string | string[];
265
267
  };
266
268
  export interface LinkComponentBaseProps extends Partial<Pick<Visit<RequestPayload>, 'data' | 'method' | 'replace' | 'preserveScroll' | 'preserveState' | 'only' | 'except' | 'headers' | 'queryStringArrayFormat' | 'async'> & Omit<VisitCallbacks, 'onCancelToken'> & {
267
- href: string | {
268
- url: string;
269
- method: Method;
270
- };
269
+ href: string | UrlMethodPair;
271
270
  onCancelToken: (cancelToken: import('axios').CancelTokenSource) => void;
272
271
  prefetch: boolean | LinkPrefetchOption | LinkPrefetchOption[];
273
272
  cacheFor: CacheForOption | CacheForOption[];
273
+ cacheTags: string | string[];
274
274
  }> {
275
275
  }
276
276
  type PrefetchObject = {
@@ -290,6 +290,7 @@ export type PrefetchedResponse = PrefetchObject & {
290
290
  timestamp: number;
291
291
  singleUse: boolean;
292
292
  inFlight: false;
293
+ tags: string[];
293
294
  };
294
295
  export type PrefetchRemovalTimer = {
295
296
  params: ActiveVisit;
@@ -310,17 +311,21 @@ export type ProgressSettings = {
310
311
  includeCSS: boolean;
311
312
  color: string;
312
313
  };
314
+ export type UrlMethodPair = {
315
+ url: string;
316
+ method: Method;
317
+ };
313
318
  export type FormComponentOptions = Pick<VisitOptions, 'preserveScroll' | 'preserveState' | 'preserveUrl' | 'replace' | 'only' | 'except' | 'reset'>;
314
- export type FormComponentProps = Partial<Pick<Visit, 'headers' | 'queryStringArrayFormat' | 'errorBag' | 'showProgress'> & Omit<VisitCallbacks, 'onPrefetched' | 'onPrefetching'>> & {
319
+ export type FormComponentProps = Partial<Pick<Visit, 'headers' | 'queryStringArrayFormat' | 'errorBag' | 'showProgress' | 'invalidateCacheTags'> & Omit<VisitCallbacks, 'onPrefetched' | 'onPrefetching'>> & {
315
320
  method?: Method | Uppercase<Method>;
316
- action?: string | {
317
- url: string;
318
- method: Method;
319
- };
321
+ action?: string | UrlMethodPair;
320
322
  transform?: (data: Record<string, FormDataConvertible>) => Record<string, FormDataConvertible>;
321
323
  options?: FormComponentOptions;
322
324
  onSubmitComplete?: (props: FormComponentonSubmitCompleteArguments) => void;
323
325
  disableWhileProcessing?: boolean;
326
+ resetOnSuccess?: boolean | string[];
327
+ resetOnError?: boolean | string[];
328
+ setDefaultsOnSuccess?: boolean;
324
329
  };
325
330
  export type FormComponentMethods = {
326
331
  clearErrors: (...fields: string[]) => void;
package/types/url.d.ts CHANGED
@@ -1,4 +1,4 @@
1
- import { FormDataConvertible, Method, RequestPayload, VisitOptions } from './types';
1
+ import { FormDataConvertible, Method, RequestPayload, UrlMethodPair, VisitOptions } from './types';
2
2
  export declare function hrefToUrl(href: string | URL): URL;
3
3
  export declare const transformUrlAndData: (href: string | URL, data: RequestPayload, method: Method, forceFormData: VisitOptions['forceFormData'], queryStringArrayFormat: VisitOptions['queryStringArrayFormat']) => [URL, RequestPayload];
4
4
  type MergeDataIntoQueryStringDataReturnType<T extends RequestPayload> = T extends Record<string, FormDataConvertible> ? Record<string, FormDataConvertible> : RequestPayload;
@@ -6,4 +6,5 @@ export declare function mergeDataIntoQueryString<T extends RequestPayload>(metho
6
6
  export declare function urlWithoutHash(url: URL | Location): URL;
7
7
  export declare const setHashIfSameUrl: (originUrl: URL | Location, destinationUrl: URL | Location) => void;
8
8
  export declare const isSameUrlWithoutHash: (url1: URL | Location, url2: URL | Location) => boolean;
9
+ export declare function isUrlMethodPair(href: unknown): href is UrlMethodPair;
9
10
  export {};
@@ -1 +0,0 @@
1
- export default function shouldIntercept(event: Pick<MouseEvent, 'altKey' | 'ctrlKey' | 'defaultPrevented' | 'target' | 'currentTarget' | 'metaKey' | 'shiftKey' | 'button'>): boolean;