@emkodev/emroute 1.7.0 → 1.7.1-beta.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/dist/emroute.js +55 -1
- package/dist/emroute.js.map +2 -2
- package/dist/runtime/abstract.runtime.d.ts +6 -0
- package/dist/runtime/abstract.runtime.js +66 -1
- package/dist/runtime/abstract.runtime.js.map +1 -1
- package/dist/server/build.util.js +21 -9
- package/dist/server/build.util.js.map +1 -1
- package/package.json +1 -1
- package/runtime/abstract.runtime.ts +72 -1
- package/server/build.util.ts +19 -9
|
@@ -39,6 +39,12 @@ export declare abstract class Runtime {
|
|
|
39
39
|
abstract query(resource: FetchParams[0], options?: FetchParams[1]): FetchReturn;
|
|
40
40
|
/** Write. Defaults to PUT; pass `{ method: "DELETE" }` etc. to override. */
|
|
41
41
|
command(resource: FetchParams[0], options?: FetchParams[1]): FetchReturn;
|
|
42
|
+
/**
|
|
43
|
+
* Parse a single route file path and merge it into the stored manifest.
|
|
44
|
+
* Avoids a full directory rescan — just reads the current manifest,
|
|
45
|
+
* inserts the new entry, and writes it back.
|
|
46
|
+
*/
|
|
47
|
+
private mergeRouteIntoManifest;
|
|
42
48
|
/**
|
|
43
49
|
* Dynamically import a module from this runtime's storage.
|
|
44
50
|
* Used by the server for SSR imports of `.page.ts` and `.widget.ts` files.
|
|
@@ -46,7 +46,72 @@ export class Runtime {
|
|
|
46
46
|
}
|
|
47
47
|
/** Write. Defaults to PUT; pass `{ method: "DELETE" }` etc. to override. */
|
|
48
48
|
command(resource, options) {
|
|
49
|
-
|
|
49
|
+
const path = typeof resource === 'string'
|
|
50
|
+
? resource
|
|
51
|
+
: new URL(resource instanceof Request ? resource.url : resource.toString()).pathname;
|
|
52
|
+
const result = this.handle(resource, { method: 'PUT', ...options });
|
|
53
|
+
const routesDir = this.config.routesDir ?? DEFAULT_ROUTES_DIR;
|
|
54
|
+
if (path.startsWith(routesDir + '/')) {
|
|
55
|
+
return result.then(async (res) => {
|
|
56
|
+
await this.mergeRouteIntoManifest(path, routesDir);
|
|
57
|
+
return res;
|
|
58
|
+
});
|
|
59
|
+
}
|
|
60
|
+
return result;
|
|
61
|
+
}
|
|
62
|
+
/**
|
|
63
|
+
* Parse a single route file path and merge it into the stored manifest.
|
|
64
|
+
* Avoids a full directory rescan — just reads the current manifest,
|
|
65
|
+
* inserts the new entry, and writes it back.
|
|
66
|
+
*/
|
|
67
|
+
async mergeRouteIntoManifest(filePath, routesDir) {
|
|
68
|
+
const relativePath = filePath.slice(routesDir.length + 1);
|
|
69
|
+
const parts = relativePath.split('/');
|
|
70
|
+
const filename = parts[parts.length - 1];
|
|
71
|
+
const dirSegments = parts.slice(0, -1);
|
|
72
|
+
const match = filename.match(/^(.+?)\.(page|error|redirect)\.(ts|js|html|md|css)$/);
|
|
73
|
+
if (!match)
|
|
74
|
+
return;
|
|
75
|
+
const [, name, kind, ext] = match;
|
|
76
|
+
// Read current manifest (or start fresh)
|
|
77
|
+
const response = await this.handle(ROUTES_MANIFEST_PATH);
|
|
78
|
+
const tree = response.status === 404
|
|
79
|
+
? {}
|
|
80
|
+
: await response.json();
|
|
81
|
+
// Walk to the parent node
|
|
82
|
+
let node = tree;
|
|
83
|
+
for (const dir of dirSegments) {
|
|
84
|
+
if (dir.startsWith('[') && dir.endsWith(']')) {
|
|
85
|
+
const param = dir.slice(1, -1);
|
|
86
|
+
node.dynamic ??= { param, child: {} };
|
|
87
|
+
node = node.dynamic.child;
|
|
88
|
+
}
|
|
89
|
+
else {
|
|
90
|
+
node.children ??= {};
|
|
91
|
+
node.children[dir] ??= {};
|
|
92
|
+
node = node.children[dir];
|
|
93
|
+
}
|
|
94
|
+
}
|
|
95
|
+
// Place the file
|
|
96
|
+
if (kind === 'error') {
|
|
97
|
+
node.errorBoundary = filePath;
|
|
98
|
+
}
|
|
99
|
+
else {
|
|
100
|
+
const target = resolveTargetNode(node, name, dirSegments.length === 0);
|
|
101
|
+
if (kind === 'redirect') {
|
|
102
|
+
target.redirect = filePath;
|
|
103
|
+
}
|
|
104
|
+
else {
|
|
105
|
+
target.files ??= {};
|
|
106
|
+
target.files[ext] = filePath;
|
|
107
|
+
}
|
|
108
|
+
}
|
|
109
|
+
// Write updated manifest back
|
|
110
|
+
this.routesManifestCache = null;
|
|
111
|
+
await this.handle(ROUTES_MANIFEST_PATH, {
|
|
112
|
+
method: 'PUT',
|
|
113
|
+
body: JSON.stringify(tree),
|
|
114
|
+
});
|
|
50
115
|
}
|
|
51
116
|
/**
|
|
52
117
|
* Dynamically import a module from this runtime's storage.
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"abstract.runtime.js","sourceRoot":"","sources":["../../runtime/abstract.runtime.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,iBAAiB,EAAE,MAAM,iCAAiC,CAAC;AAGpE,MAAM,CAAC,MAAM,aAAa,GAAwB,IAAI,GAAG,CAAiB;IACxE,CAAC,OAAO,EAAE,0BAA0B,CAAC;IACrC,CAAC,MAAM,EAAE,yBAAyB,CAAC;IACnC,CAAC,KAAK,EAAE,uCAAuC,CAAC;IAChD,CAAC,MAAM,EAAE,uCAAuC,CAAC;IACjD,CAAC,KAAK,EAAE,gCAAgC,CAAC;IACzC,CAAC,OAAO,EAAE,iCAAiC,CAAC;IAC5C,CAAC,KAAK,EAAE,2BAA2B,CAAC;IACpC,CAAC,MAAM,EAAE,2BAA2B,CAAC;IACrC,CAAC,OAAO,EAAE,kBAAkB,CAAC;IAC7B,CAAC,MAAM,EAAE,iCAAiC,CAAC;IAC3C,CAAC,MAAM,EAAE,WAAW,CAAC;IACrB,CAAC,MAAM,EAAE,YAAY,CAAC;IACtB,CAAC,OAAO,EAAE,YAAY,CAAC;IACvB,CAAC,MAAM,EAAE,WAAW,CAAC;IACrB,CAAC,MAAM,EAAE,eAAe,CAAC;IACzB,CAAC,MAAM,EAAE,cAAc,CAAC;IACxB,CAAC,OAAO,EAAE,YAAY,CAAC;IACvB,CAAC,OAAO,EAAE,YAAY,CAAC;IACvB,CAAC,OAAO,EAAE,WAAW,CAAC;IACtB,CAAC,QAAQ,EAAE,YAAY,CAAC;IACxB,CAAC,MAAM,EAAE,UAAU,CAAC;CACrB,CAAC,CAAC;AAKH,MAAM,CAAC,MAAM,kBAAkB,GAAG,SAAS,CAAC;AAC5C,MAAM,CAAC,MAAM,mBAAmB,GAAG,UAAU,CAAC;AAC9C,MAAM,CAAC,MAAM,oBAAoB,GAAG,uBAAuB,CAAC;AAC5D,MAAM,CAAC,MAAM,qBAAqB,GAAG,wBAAwB,CAAC;AAO9D;;;;;;;;;;;GAWG;AACH,MAAM,OAAgB,OAAO;IACN;IAArB,YAAqB,SAAwB,EAAE;QAA1B,WAAM,GAAN,MAAM,CAAoB;QAC7C,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC;IACvB,CAAC;IAkBD,4EAA4E;IAC5E,OAAO,CAAC,QAAwB,EAAE,OAAwB;QACxD,OAAO,IAAI,CAAC,MAAM,CAAC,QAAQ,EAAE,EAAE,MAAM,EAAE,KAAK,EAAE,GAAG,OAAO,EAAE,CAAC,CAAC;
|
|
1
|
+
{"version":3,"file":"abstract.runtime.js","sourceRoot":"","sources":["../../runtime/abstract.runtime.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,iBAAiB,EAAE,MAAM,iCAAiC,CAAC;AAGpE,MAAM,CAAC,MAAM,aAAa,GAAwB,IAAI,GAAG,CAAiB;IACxE,CAAC,OAAO,EAAE,0BAA0B,CAAC;IACrC,CAAC,MAAM,EAAE,yBAAyB,CAAC;IACnC,CAAC,KAAK,EAAE,uCAAuC,CAAC;IAChD,CAAC,MAAM,EAAE,uCAAuC,CAAC;IACjD,CAAC,KAAK,EAAE,gCAAgC,CAAC;IACzC,CAAC,OAAO,EAAE,iCAAiC,CAAC;IAC5C,CAAC,KAAK,EAAE,2BAA2B,CAAC;IACpC,CAAC,MAAM,EAAE,2BAA2B,CAAC;IACrC,CAAC,OAAO,EAAE,kBAAkB,CAAC;IAC7B,CAAC,MAAM,EAAE,iCAAiC,CAAC;IAC3C,CAAC,MAAM,EAAE,WAAW,CAAC;IACrB,CAAC,MAAM,EAAE,YAAY,CAAC;IACtB,CAAC,OAAO,EAAE,YAAY,CAAC;IACvB,CAAC,MAAM,EAAE,WAAW,CAAC;IACrB,CAAC,MAAM,EAAE,eAAe,CAAC;IACzB,CAAC,MAAM,EAAE,cAAc,CAAC;IACxB,CAAC,OAAO,EAAE,YAAY,CAAC;IACvB,CAAC,OAAO,EAAE,YAAY,CAAC;IACvB,CAAC,OAAO,EAAE,WAAW,CAAC;IACtB,CAAC,QAAQ,EAAE,YAAY,CAAC;IACxB,CAAC,MAAM,EAAE,UAAU,CAAC;CACrB,CAAC,CAAC;AAKH,MAAM,CAAC,MAAM,kBAAkB,GAAG,SAAS,CAAC;AAC5C,MAAM,CAAC,MAAM,mBAAmB,GAAG,UAAU,CAAC;AAC9C,MAAM,CAAC,MAAM,oBAAoB,GAAG,uBAAuB,CAAC;AAC5D,MAAM,CAAC,MAAM,qBAAqB,GAAG,wBAAwB,CAAC;AAO9D;;;;;;;;;;;GAWG;AACH,MAAM,OAAgB,OAAO;IACN;IAArB,YAAqB,SAAwB,EAAE;QAA1B,WAAM,GAAN,MAAM,CAAoB;QAC7C,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC;IACvB,CAAC;IAkBD,4EAA4E;IAC5E,OAAO,CAAC,QAAwB,EAAE,OAAwB;QACxD,MAAM,IAAI,GAAG,OAAO,QAAQ,KAAK,QAAQ;YACvC,CAAC,CAAC,QAAQ;YACV,CAAC,CAAC,IAAI,GAAG,CAAC,QAAQ,YAAY,OAAO,CAAC,CAAC,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,QAAQ,CAAC,QAAQ,EAAE,CAAC,CAAC,QAAQ,CAAC;QACvF,MAAM,MAAM,GAAG,IAAI,CAAC,MAAM,CAAC,QAAQ,EAAE,EAAE,MAAM,EAAE,KAAK,EAAE,GAAG,OAAO,EAAE,CAAC,CAAC;QACpE,MAAM,SAAS,GAAG,IAAI,CAAC,MAAM,CAAC,SAAS,IAAI,kBAAkB,CAAC;QAC9D,IAAI,IAAI,CAAC,UAAU,CAAC,SAAS,GAAG,GAAG,CAAC,EAAE,CAAC;YACrC,OAAO,MAAM,CAAC,IAAI,CAAC,KAAK,EAAE,GAAG,EAAE,EAAE;gBAC/B,MAAM,IAAI,CAAC,sBAAsB,CAAC,IAAI,EAAE,SAAS,CAAC,CAAC;gBACnD,OAAO,GAAG,CAAC;YACb,CAAC,CAAC,CAAC;QACL,CAAC;QACD,OAAO,MAAM,CAAC;IAChB,CAAC;IAED;;;;OAIG;IACK,KAAK,CAAC,sBAAsB,CAClC,QAAgB,EAChB,SAAiB;QAEjB,MAAM,YAAY,GAAG,QAAQ,CAAC,KAAK,CAAC,SAAS,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;QAC1D,MAAM,KAAK,GAAG,YAAY,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;QACtC,MAAM,QAAQ,GAAG,KAAK,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;QACzC,MAAM,WAAW,GAAG,KAAK,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;QAEvC,MAAM,KAAK,GAAG,QAAQ,CAAC,KAAK,CAAC,qDAAqD,CAAC,CAAC;QACpF,IAAI,CAAC,KAAK;YAAE,OAAO;QAEnB,MAAM,CAAC,EAAE,IAAI,EAAE,IAAI,EAAE,GAAG,CAAC,GAAG,KAAK,CAAC;QAElC,yCAAyC;QACzC,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,MAAM,CAAC,oBAAoB,CAAC,CAAC;QACzD,MAAM,IAAI,GAAc,QAAQ,CAAC,MAAM,KAAK,GAAG;YAC7C,CAAC,CAAC,EAAE;YACJ,CAAC,CAAC,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAC;QAE1B,0BAA0B;QAC1B,IAAI,IAAI,GAAG,IAAI,CAAC;QAChB,KAAK,MAAM,GAAG,IAAI,WAAW,EAAE,CAAC;YAC9B,IAAI,GAAG,CAAC,UAAU,CAAC,GAAG,CAAC,IAAI,GAAG,CAAC,QAAQ,CAAC,GAAG,CAAC,EAAE,CAAC;gBAC7C,MAAM,KAAK,GAAG,GAAG,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;gBAC/B,IAAI,CAAC,OAAO,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,EAAE,EAAE,CAAC;gBACtC,IAAI,GAAG,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC;YAC5B,CAAC;iBAAM,CAAC;gBACN,IAAI,CAAC,QAAQ,KAAK,EAAE,CAAC;gBACrB,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,KAAK,EAAE,CAAC;gBAC1B,IAAI,GAAG,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC;YAC5B,CAAC;QACH,CAAC;QAED,iBAAiB;QACjB,IAAI,IAAI,KAAK,OAAO,EAAE,CAAC;YACrB,IAAI,CAAC,aAAa,GAAG,QAAQ,CAAC;QAChC,CAAC;aAAM,CAAC;YACN,MAAM,MAAM,GAAG,iBAAiB,CAAC,IAAI,EAAE,IAAI,EAAE,WAAW,CAAC,MAAM,KAAK,CAAC,CAAC,CAAC;YACvE,IAAI,IAAI,KAAK,UAAU,EAAE,CAAC;gBACxB,MAAM,CAAC,QAAQ,GAAG,QAAQ,CAAC;YAC7B,CAAC;iBAAM,CAAC;gBACN,MAAM,CAAC,KAAK,KAAK,EAAE,CAAC;gBACpB,MAAM,CAAC,KAAK,CAAC,GAAuB,CAAC,GAAG,QAAQ,CAAC;YACnD,CAAC;QACH,CAAC;QAED,8BAA8B;QAC9B,IAAI,CAAC,mBAAmB,GAAG,IAAI,CAAC;QAChC,MAAM,IAAI,CAAC,MAAM,CAAC,oBAAoB,EAAE;YACtC,MAAM,EAAE,KAAK;YACb,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC;SAC3B,CAAC,CAAC;IACL,CAAC;IAED;;;OAGG;IACH,UAAU,CAAC,KAAa;QACtB,MAAM,IAAI,KAAK,CAAC,kCAAkC,IAAI,CAAC,WAAW,CAAC,IAAI,EAAE,CAAC,CAAC;IAC7E,CAAC;IAED;;;OAGG;IACH,SAAS,CAAC,OAAe;QACvB,MAAM,IAAI,KAAK,CAAC,iCAAiC,IAAI,CAAC,WAAW,CAAC,IAAI,EAAE,CAAC,CAAC;IAC5E,CAAC;IAED,uEAAuE;IAE/D,mBAAmB,GAAoB,IAAI,CAAC;IAC5C,oBAAoB,GAAoB,IAAI,CAAC;IAErD,sEAAsE;IACtE,mBAAmB;QACjB,IAAI,CAAC,mBAAmB,GAAG,IAAI,CAAC;QAChC,IAAI,CAAC,oBAAoB,GAAG,IAAI,CAAC;IACnC,CAAC;IAED;;;OAGG;IACH,KAAK,CAAC,qBAAqB;QACzB,IAAI,IAAI,CAAC,mBAAmB;YAAE,OAAO,IAAI,CAAC,mBAAmB,CAAC,KAAK,EAAE,CAAC;QAEtE,MAAM,SAAS,GAAG,IAAI,CAAC,MAAM,CAAC,SAAS,IAAI,kBAAkB,CAAC;QAE9D,2CAA2C;QAC3C,MAAM,WAAW,GAAG,MAAM,IAAI,CAAC,KAAK,CAAC,SAAS,GAAG,GAAG,CAAC,CAAC;QACtD,IAAI,WAAW,CAAC,MAAM,KAAK,GAAG,EAAE,CAAC;YAC/B,OAAO,IAAI,QAAQ,CAAC,WAAW,EAAE,EAAE,MAAM,EAAE,GAAG,EAAE,CAAC,CAAC;QACpD,CAAC;QAED,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC,UAAU,CAAC,SAAS,CAAC,CAAC;QAE9C,IAAI,CAAC,mBAAmB,GAAG,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAC/C,OAAO,IAAI,CAAC,mBAAmB,CAAC,KAAK,EAAE,CAAC;IAC1C,CAAC;IAED;;;OAGG;IACH,KAAK,CAAC,sBAAsB;QAC1B,IAAI,IAAI,CAAC,oBAAoB;YAAE,OAAO,IAAI,CAAC,oBAAoB,CAAC,KAAK,EAAE,CAAC;QAExE,MAAM,UAAU,GAAG,IAAI,CAAC,MAAM,CAAC,UAAU,IAAI,mBAAmB,CAAC;QAEjE,MAAM,WAAW,GAAG,MAAM,IAAI,CAAC,KAAK,CAAC,UAAU,GAAG,GAAG,CAAC,CAAC;QACvD,IAAI,WAAW,CAAC,MAAM,KAAK,GAAG,EAAE,CAAC;YAC/B,OAAO,IAAI,QAAQ,CAAC,WAAW,EAAE,EAAE,MAAM,EAAE,GAAG,EAAE,CAAC,CAAC;QACpD,CAAC;QAED,MAAM,OAAO,GAAG,MAAM,IAAI,CAAC,WAAW,CAAC,UAAU,EAAE,UAAU,CAAC,OAAO,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC,CAAC;QAClF,IAAI,CAAC,oBAAoB,GAAG,QAAQ,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;QACnD,OAAO,IAAI,CAAC,oBAAoB,CAAC,KAAK,EAAE,CAAC;IAC3C,CAAC;IAED,yEAAyE;IAE/D,KAAK,CAAC,CAAC,aAAa,CAAC,GAAW;QACxC,MAAM,WAAW,GAAG,GAAG,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,GAAG,GAAG,CAAC;QACxD,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,KAAK,CAAC,WAAW,CAAC,CAAC;QAC/C,MAAM,OAAO,GAAa,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAC;QAEhD,KAAK,MAAM,KAAK,IAAI,OAAO,EAAE,CAAC;YAC5B,MAAM,IAAI,GAAG,GAAG,WAAW,GAAG,KAAK,EAAE,CAAC;YACtC,IAAI,KAAK,CAAC,QAAQ,CAAC,GAAG,CAAC,EAAE,CAAC;gBACxB,KAAK,CAAC,CAAC,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,CAAC;YAClC,CAAC;iBAAM,CAAC;gBACN,MAAM,IAAI,CAAC;YACb,CAAC;QACH,CAAC;IACH,CAAC;IAED;;;OAGG;IACO,KAAK,CAAC,UAAU,CAAC,SAAiB;QAC1C,MAAM,IAAI,GAAc,EAAE,CAAC;QAE3B,MAAM,QAAQ,GAAa,EAAE,CAAC;QAC9B,IAAI,KAAK,EAAE,MAAM,IAAI,IAAI,IAAI,CAAC,aAAa,CAAC,SAAS,CAAC,EAAE,CAAC;YACvD,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACtB,CAAC;QAED,KAAK,MAAM,QAAQ,IAAI,QAAQ,EAAE,CAAC;YAChC,MAAM,YAAY,GAAG,QAAQ,CAAC,OAAO,CAAC,GAAG,SAAS,GAAG,EAAE,EAAE,CAAC,CAAC;YAC3D,MAAM,KAAK,GAAG,YAAY,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;YACtC,MAAM,QAAQ,GAAG,KAAK,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;YACzC,MAAM,WAAW,GAAG,KAAK,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;YAEvC,2FAA2F;YAC3F,MAAM,KAAK,GAAG,QAAQ,CAAC,KAAK,CAAC,qDAAqD,CAAC,CAAC;YACpF,IAAI,CAAC,KAAK;gBAAE,SAAS;YAErB,MAAM,CAAC,EAAE,IAAI,EAAE,IAAI,EAAE,GAAG,CAAC,GAAG,KAAK,CAAC;YAElC,mDAAmD;YACnD,IAAI,IAAI,GAAG,IAAI,CAAC;YAChB,KAAK,MAAM,GAAG,IAAI,WAAW,EAAE,CAAC;gBAC9B,IAAI,GAAG,CAAC,UAAU,CAAC,GAAG,CAAC,IAAI,GAAG,CAAC,QAAQ,CAAC,GAAG,CAAC,EAAE,CAAC;oBAC7C,MAAM,KAAK,GAAG,GAAG,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;oBAC/B,IAAI,CAAC,OAAO,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,EAAE,EAAE,CAAC;oBACtC,IAAI,GAAG,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC;gBAC5B,CAAC;qBAAM,CAAC;oBACN,IAAI,CAAC,QAAQ,KAAK,EAAE,CAAC;oBACrB,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,KAAK,EAAE,CAAC;oBAC1B,IAAI,GAAG,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC;gBAC5B,CAAC;YACH,CAAC;YAED,qCAAqC;YACrC,IAAI,IAAI,KAAK,OAAO,EAAE,CAAC;gBACrB,kDAAkD;gBAClD,6DAA6D;gBAC7D,4DAA4D;gBAC5D,IAAI,CAAC,aAAa,GAAG,QAAQ,CAAC;gBAC9B,SAAS;YACX,CAAC;YAED,kEAAkE;YAClE,MAAM,MAAM,GAAG,iBAAiB,CAAC,IAAI,EAAE,IAAI,EAAE,WAAW,CAAC,MAAM,KAAK,CAAC,CAAC,CAAC;YAEvE,IAAI,IAAI,KAAK,UAAU,EAAE,CAAC;gBACxB,MAAM,CAAC,QAAQ,GAAG,QAAQ,CAAC;YAC7B,CAAC;iBAAM,CAAC;gBACN,kBAAkB;gBAClB,MAAM,CAAC,KAAK,KAAK,EAAE,CAAC;gBACpB,MAAM,CAAC,KAAK,CAAC,GAAuB,CAAC,GAAG,QAAQ,CAAC;YACnD,CAAC;QACH,CAAC;QAED,OAAO,IAAI,CAAC;IACd,CAAC;IAES,KAAK,CAAC,WAAW,CACzB,UAAkB,EAClB,UAAmB;QAEnB,MAAM,oBAAoB,GAAG,CAAC,MAAM,EAAE,IAAI,EAAE,KAAK,CAAU,CAAC;QAC5D,MAAM,OAAO,GAA0B,EAAE,CAAC;QAE1C,MAAM,WAAW,GAAG,UAAU,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,UAAU,GAAG,GAAG,CAAC;QAC7E,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,KAAK,CAAC,WAAW,CAAC,CAAC;QAC/C,MAAM,OAAO,GAAa,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAC;QAEhD,KAAK,MAAM,IAAI,IAAI,OAAO,EAAE,CAAC;YAC3B,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC;gBAAE,SAAS;YAElC,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;YAE/B,wCAAwC;YACxC,IAAI,UAAU,GAAG,GAAG,IAAI,YAAY,CAAC;YACrC,IAAI,UAAU,GAAG,GAAG,WAAW,GAAG,IAAI,IAAI,UAAU,EAAE,CAAC;YACvD,IAAI,CAAC,MAAM,IAAI,CAAC,KAAK,CAAC,UAAU,CAAC,CAAC,CAAC,MAAM,KAAK,GAAG,EAAE,CAAC;gBAClD,UAAU,GAAG,GAAG,IAAI,YAAY,CAAC;gBACjC,UAAU,GAAG,GAAG,WAAW,GAAG,IAAI,IAAI,UAAU,EAAE,CAAC;gBACnD,IAAI,CAAC,MAAM,IAAI,CAAC,KAAK,CAAC,UAAU,CAAC,CAAC,CAAC,MAAM,KAAK,GAAG;oBAAE,SAAS;YAC9D,CAAC;YAED,MAAM,MAAM,GAAG,UAAU,CAAC,CAAC,CAAC,GAAG,UAAU,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC;YAClD,MAAM,KAAK,GAAwB;gBACjC,IAAI;gBACJ,UAAU,EAAE,GAAG,MAAM,GAAG,IAAI,IAAI,UAAU,EAAE;gBAC5C,OAAO,EAAE,UAAU,IAAI,EAAE;aAC1B,CAAC;YAEF,MAAM,KAAK,GAAiD,EAAE,CAAC;YAC/D,IAAI,QAAQ,GAAG,KAAK,CAAC;YACrB,KAAK,MAAM,GAAG,IAAI,oBAAoB,EAAE,CAAC;gBACvC,MAAM,aAAa,GAAG,GAAG,IAAI,WAAW,GAAG,EAAE,CAAC;gBAC9C,MAAM,aAAa,GAAG,GAAG,WAAW,GAAG,IAAI,IAAI,aAAa,EAAE,CAAC;gBAC/D,IAAI,CAAC,MAAM,IAAI,CAAC,KAAK,CAAC,aAAa,CAAC,CAAC,CAAC,MAAM,KAAK,GAAG,EAAE,CAAC;oBACrD,KAAK,CAAC,GAAG,CAAC,GAAG,GAAG,MAAM,GAAG,IAAI,IAAI,aAAa,EAAE,CAAC;oBACjD,QAAQ,GAAG,IAAI,CAAC;gBAClB,CAAC;YACH,CAAC;YAED,IAAI,QAAQ;gBAAE,KAAK,CAAC,KAAK,GAAG,KAAK,CAAC;YAClC,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QACtB,CAAC;QAED,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC;QACrD,OAAO,OAAO,CAAC;IACjB,CAAC;CACF"}
|
|
@@ -52,25 +52,37 @@ export async function buildClientBundles(options) {
|
|
|
52
52
|
const emrouteJs = await readFile(emrouteJsPath);
|
|
53
53
|
await runtime.command(paths.emroute, { body: emrouteJs });
|
|
54
54
|
// App bundle — consumer's main.ts bundled with esbuild.
|
|
55
|
+
// Try filesystem first (where node_modules lives), then runtime, then generate.
|
|
55
56
|
const ep = entryPoint ?? '/main.ts';
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
await
|
|
57
|
+
let source;
|
|
58
|
+
try {
|
|
59
|
+
source = await readFile(root + ep, 'utf-8');
|
|
60
|
+
}
|
|
61
|
+
catch {
|
|
62
|
+
const epResponse = await runtime.query(ep);
|
|
63
|
+
if (epResponse.status !== 404)
|
|
64
|
+
source = await epResponse.text();
|
|
59
65
|
}
|
|
66
|
+
source ??= generateMainTs(spa, '@emkodev/emroute');
|
|
60
67
|
const result = await esbuild.build({
|
|
61
68
|
bundle: true,
|
|
62
69
|
write: false,
|
|
63
70
|
format: 'esm',
|
|
64
71
|
platform: 'browser',
|
|
65
|
-
|
|
66
|
-
outfile:
|
|
72
|
+
stdin: { contents: source, loader: 'ts', resolveDir: root },
|
|
73
|
+
outfile: paths.app,
|
|
67
74
|
external: [...EMROUTE_EXTERNALS],
|
|
68
75
|
});
|
|
69
76
|
for (const file of result.outputFiles) {
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
77
|
+
await runtime.command(paths.app, { body: file.contents });
|
|
78
|
+
}
|
|
79
|
+
// Copy main.css from disk into runtime if it exists (and runtime doesn't have it)
|
|
80
|
+
if ((await runtime.query('/main.css')).status === 404) {
|
|
81
|
+
try {
|
|
82
|
+
const css = await readFile(root + '/main.css');
|
|
83
|
+
await runtime.command('/main.css', { body: css });
|
|
84
|
+
}
|
|
85
|
+
catch { /* no main.css on disk — fine */ }
|
|
74
86
|
}
|
|
75
87
|
// Write shell (index.html) if not already present
|
|
76
88
|
await writeShell(runtime, paths);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"build.util.js","sourceRoot":"","sources":["../../server/build.util.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AAEH,OAAO,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AAC5C,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAC5C,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAEpC,OAAO,EACL,oBAAoB,EACpB,qBAAqB,GACtB,MAAM,gCAAgC,CAAC;AAGxC,OAAO,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAC;AAGnD,MAAM,CAAC,MAAM,iBAAiB,GAAG;IAC/B,sBAAsB;IACtB,0BAA0B;IAC1B,kBAAkB;IAClB,yBAAyB;IACzB,gCAAgC;CACxB,CAAC;AAEX,kFAAkF;AAClF,MAAM,CAAC,MAAM,kBAAkB,GAAG,SAAS,CAAC;AAe5C,MAAM,oBAAoB,GAAG,EAAE,OAAO,EAAE,aAAa,EAAE,GAAG,EAAE,SAAS,EAAE,CAAC;AAExE;;;;;;;;;GASG;AACH,MAAM,CAAC,KAAK,UAAU,kBAAkB,CAAC,OAAqB;IAC5D,MAAM,EAAE,OAAO,EAAE,IAAI,EAAE,GAAG,EAAE,UAAU,EAAE,GAAG,OAAO,CAAC;IACnD,IAAI,GAAG,KAAK,MAAM;QAAE,OAAO;IAE3B,MAAM,KAAK,GAAG,OAAO,CAAC,WAAW,IAAI,oBAAoB,CAAC;IAE1D,oEAAoE;IACpE,MAAM,YAAY,CAAC,OAAO,CAAC,CAAC;IAE5B,8DAA8D;IAC9D,MAAM,OAAO,GAAG,MAAM,WAAW,EAAS,CAAC;IAE3C,mDAAmD;IACnD,MAAM,eAAe,GAAG,aAAa,CAAC,IAAI,GAAG,GAAG,CAAC,CAAC;IAClD,MAAM,aAAa,GAAG,qBAAqB,CAAC,eAAe,CAAC,CAAC;IAC7D,MAAM,SAAS,GAAG,MAAM,QAAQ,CAAC,aAAa,CAAC,CAAC;IAChD,MAAM,OAAO,CAAC,OAAO,CAAC,KAAK,CAAC,OAAO,EAAE,EAAE,IAAI,EAAE,SAAS,EAAE,CAAC,CAAC;IAE1D,wDAAwD;IACxD,MAAM,EAAE,GAAG,UAAU,IAAI,UAAU,CAAC;IACpC,IAAI,CAAC,MAAM,
|
|
1
|
+
{"version":3,"file":"build.util.js","sourceRoot":"","sources":["../../server/build.util.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AAEH,OAAO,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AAC5C,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAC5C,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAEpC,OAAO,EACL,oBAAoB,EACpB,qBAAqB,GACtB,MAAM,gCAAgC,CAAC;AAGxC,OAAO,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAC;AAGnD,MAAM,CAAC,MAAM,iBAAiB,GAAG;IAC/B,sBAAsB;IACtB,0BAA0B;IAC1B,kBAAkB;IAClB,yBAAyB;IACzB,gCAAgC;CACxB,CAAC;AAEX,kFAAkF;AAClF,MAAM,CAAC,MAAM,kBAAkB,GAAG,SAAS,CAAC;AAe5C,MAAM,oBAAoB,GAAG,EAAE,OAAO,EAAE,aAAa,EAAE,GAAG,EAAE,SAAS,EAAE,CAAC;AAExE;;;;;;;;;GASG;AACH,MAAM,CAAC,KAAK,UAAU,kBAAkB,CAAC,OAAqB;IAC5D,MAAM,EAAE,OAAO,EAAE,IAAI,EAAE,GAAG,EAAE,UAAU,EAAE,GAAG,OAAO,CAAC;IACnD,IAAI,GAAG,KAAK,MAAM;QAAE,OAAO;IAE3B,MAAM,KAAK,GAAG,OAAO,CAAC,WAAW,IAAI,oBAAoB,CAAC;IAE1D,oEAAoE;IACpE,MAAM,YAAY,CAAC,OAAO,CAAC,CAAC;IAE5B,8DAA8D;IAC9D,MAAM,OAAO,GAAG,MAAM,WAAW,EAAS,CAAC;IAE3C,mDAAmD;IACnD,MAAM,eAAe,GAAG,aAAa,CAAC,IAAI,GAAG,GAAG,CAAC,CAAC;IAClD,MAAM,aAAa,GAAG,qBAAqB,CAAC,eAAe,CAAC,CAAC;IAC7D,MAAM,SAAS,GAAG,MAAM,QAAQ,CAAC,aAAa,CAAC,CAAC;IAChD,MAAM,OAAO,CAAC,OAAO,CAAC,KAAK,CAAC,OAAO,EAAE,EAAE,IAAI,EAAE,SAAS,EAAE,CAAC,CAAC;IAE1D,wDAAwD;IACxD,gFAAgF;IAChF,MAAM,EAAE,GAAG,UAAU,IAAI,UAAU,CAAC;IACpC,IAAI,MAA0B,CAAC;IAC/B,IAAI,CAAC;QACH,MAAM,GAAG,MAAM,QAAQ,CAAC,IAAI,GAAG,EAAE,EAAE,OAAO,CAAC,CAAC;IAC9C,CAAC;IAAC,MAAM,CAAC;QACP,MAAM,UAAU,GAAG,MAAM,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;QAC3C,IAAI,UAAU,CAAC,MAAM,KAAK,GAAG;YAAE,MAAM,GAAG,MAAM,UAAU,CAAC,IAAI,EAAE,CAAC;IAClE,CAAC;IACD,MAAM,KAAK,cAAc,CAAC,GAAG,EAAE,kBAAkB,CAAC,CAAC;IAEnD,MAAM,MAAM,GAAG,MAAM,OAAO,CAAC,KAAK,CAAC;QACjC,MAAM,EAAE,IAAI;QACZ,KAAK,EAAE,KAAK;QACZ,MAAM,EAAE,KAAc;QACtB,QAAQ,EAAE,SAAkB;QAC5B,KAAK,EAAE,EAAE,QAAQ,EAAE,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,UAAU,EAAE,IAAI,EAAE;QAC3D,OAAO,EAAE,KAAK,CAAC,GAAG;QAClB,QAAQ,EAAE,CAAC,GAAG,iBAAiB,CAAC;KACjC,CAAC,CAAC;IAEH,KAAK,MAAM,IAAI,IAAI,MAAM,CAAC,WAAW,EAAE,CAAC;QACtC,MAAM,OAAO,CAAC,OAAO,CAAC,KAAK,CAAC,GAAG,EAAE,EAAE,IAAI,EAAE,IAAI,CAAC,QAA+B,EAAE,CAAC,CAAC;IACnF,CAAC;IAED,kFAAkF;IAClF,IAAI,CAAC,MAAM,OAAO,CAAC,KAAK,CAAC,WAAW,CAAC,CAAC,CAAC,MAAM,KAAK,GAAG,EAAE,CAAC;QACtD,IAAI,CAAC;YACH,MAAM,GAAG,GAAG,MAAM,QAAQ,CAAC,IAAI,GAAG,WAAW,CAAC,CAAC;YAC/C,MAAM,OAAO,CAAC,OAAO,CAAC,WAAW,EAAE,EAAE,IAAI,EAAE,GAAG,EAAE,CAAC,CAAC;QACpD,CAAC;QAAC,MAAM,CAAC,CAAC,gCAAgC,CAAC,CAAC;IAC9C,CAAC;IAED,kDAAkD;IAClD,MAAM,UAAU,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC;IAEjC,MAAM,OAAO,CAAC,IAAI,EAAE,CAAC;AACvB,CAAC;AAED;;;GAGG;AACH,SAAS,qBAAqB,CAAC,OAAoB;IACjD,IAAI,CAAC;QACH,MAAM,QAAQ,GAAG,OAAO,CAAC,OAAO,CAAC,sBAAsB,CAAC,CAAC;QACzD,mEAAmE;QACnE,MAAM,SAAS,GAAG,QAAQ,CAAC,KAAK,CAAC,2CAA2C,CAAC,CAAC;QAC9E,IAAI,SAAS;YAAE,OAAO,SAAS,CAAC,CAAC,CAAC,GAAG,YAAY,CAAC;QAClD,kEAAkE;QAClE,MAAM,QAAQ,GAAG,QAAQ,CAAC,KAAK,CAAC,qCAAqC,CAAC,CAAC;QACvE,IAAI,QAAQ;YAAE,OAAO,QAAQ,CAAC,CAAC,CAAC,GAAG,iBAAiB,CAAC;IACvD,CAAC;IAAC,MAAM,CAAC,CAAC,iCAAiC,CAAC,CAAC;IAC7C,cAAc;IACd,OAAO,OAAO,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,iBAAiB,CAAC,CAAC;AACnD,CAAC;AAED,yEAAyE;AAEzE,KAAK,UAAU,UAAU,CACvB,OAAgB,EAChB,KAAuC;IAEvC,IAAI,CAAC,MAAM,OAAO,CAAC,KAAK,CAAC,aAAa,CAAC,CAAC,CAAC,MAAM,KAAK,GAAG;QAAE,OAAO;IAEhE,MAAM,OAAO,GAA2B,EAAE,CAAC;IAC3C,KAAK,MAAM,GAAG,IAAI,iBAAiB,EAAE,CAAC;QACpC,OAAO,CAAC,GAAG,CAAC,GAAG,KAAK,CAAC,OAAO,CAAC;IAC/B,CAAC;IACD,MAAM,SAAS,GAAG,IAAI,CAAC,SAAS,CAAC,EAAE,OAAO,EAAE,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC;IAEvD,MAAM,IAAI,GAAG;;;;;;;;;;;EAWb,SAAS;;+BAEoB,KAAK,CAAC,GAAG;;QAEhC,CAAC;IAEP,MAAM,OAAO,CAAC,OAAO,CAAC,aAAa,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC;AACvD,CAAC;AAED,wEAAwE;AAExE,4EAA4E;AAC5E,SAAS,qBAAqB,CAAC,CAAS;IACtC,OAAO,CAAC,CAAC,OAAO,CAAC,KAAK,EAAE,MAAM,CAAC,CAAC,OAAO,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC,OAAO,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC;AAChF,CAAC;AAED,wFAAwF;AACxF,SAAS,MAAM,CAAC,IAAY;IAC1B,OAAO,IAAI,CAAC,OAAO,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC;AACtC,CAAC;AAED;;GAEG;AACH,KAAK,UAAU,QAAQ,CAAC,OAAgB,EAAE,IAAY;IACpD,MAAM,GAAG,GAAG,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,GAAG,GAAG,IAAI,CAAC;IACrD,MAAM,QAAQ,GAAG,MAAM,OAAO,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;IAC1C,IAAI,QAAQ,CAAC,MAAM,KAAK,GAAG;QAAE,OAAO,SAAS,CAAC;IAC9C,OAAO,QAAQ,CAAC,IAAI,EAAE,CAAC;AACzB,CAAC;AAED;;;;;GAKG;AACH,KAAK,UAAU,iBAAiB,CAC9B,OAAgB,EAChB,MAAc,EACd,cAA6D;IAE7D,MAAM,MAAM,GAAG,MAAM,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC;IAC/C,IAAI,CAAC,MAAM;QAAE,MAAM,IAAI,KAAK,CAAC,+BAA+B,MAAM,EAAE,CAAC,CAAC;IAEtE,MAAM,EAAE,GAAG,MAAM,OAAO,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC;IAC3C,MAAM,MAAM,GAAG,MAAM,CAAC,MAAM,CAAC,CAAC;IAE9B,gDAAgD;IAChD,MAAM,OAAO,GAAa,EAAE,CAAC;IAC7B,IAAI,cAAc,EAAE,CAAC;QACnB,KAAK,MAAM,CAAC,GAAG,EAAE,QAAQ,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,cAAc,CAAC,EAAE,CAAC;YAC7D,IAAI,CAAC,QAAQ;gBAAE,SAAS;YACxB,MAAM,OAAO,GAAG,MAAM,QAAQ,CAAC,OAAO,EAAE,QAAQ,CAAC,CAAC;YAClD,IAAI,OAAO,KAAK,SAAS,EAAE,CAAC;gBAC1B,OAAO,CAAC,IAAI,CAAC,KAAK,GAAG,OAAO,qBAAqB,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;YAClE,CAAC;QACH,CAAC;IACH,CAAC;IAED,MAAM,MAAM,GAAG,OAAO,CAAC,MAAM,GAAG,CAAC;QAC/B,CAAC,CAAC,GAAG,EAAE,+BAA+B,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,QAAQ;QACjE,CAAC,CAAC,EAAE,CAAC;IAEP,MAAM,SAAS,GAAG,MAAM,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,GAAG,GAAG,MAAM,CAAC;IACjE,MAAM,OAAO,CAAC,OAAO,CAAC,SAAS,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC,CAAC;IACnD,OAAO,MAAM,CAAC;AAChB,CAAC;AAED;;;GAGG;AACH,KAAK,UAAU,YAAY,CAAC,OAAgB;IAC1C,kBAAkB;IAClB,MAAM,cAAc,GAAG,MAAM,OAAO,CAAC,KAAK,CAAC,oBAAoB,CAAC,CAAC;IACjE,IAAI,cAAc,CAAC,MAAM,KAAK,GAAG;QAAE,OAAO;IAC1C,MAAM,SAAS,GAAc,MAAM,cAAc,CAAC,IAAI,EAAE,CAAC;IAEzD,uBAAuB;IACvB,MAAM,eAAe,GAAG,MAAM,OAAO,CAAC,KAAK,CAAC,qBAAqB,CAAC,CAAC;IACnE,MAAM,aAAa,GAA0B,eAAe,CAAC,MAAM,KAAK,GAAG;QACzE,CAAC,CAAC,MAAM,eAAe,CAAC,IAAI,EAAE;QAC9B,CAAC,CAAC,EAAE,CAAC;IAEP,sBAAsB;IACtB,KAAK,UAAU,UAAU,CAAC,IAAe;QACvC,IAAI,IAAI,CAAC,KAAK,EAAE,EAAE,EAAE,CAAC;YACnB,MAAM,UAAU,GAAG;gBACjB,IAAI,EAAE,IAAI,CAAC,KAAK,CAAC,IAAI;gBACrB,EAAE,EAAE,IAAI,CAAC,KAAK,CAAC,EAAE;gBACjB,GAAG,EAAE,IAAI,CAAC,KAAK,CAAC,GAAG;aACpB,CAAC;YACF,IAAI,CAAC,KAAK,CAAC,EAAE,GAAG,MAAM,iBAAiB,CAAC,OAAO,EAAE,IAAI,CAAC,KAAK,CAAC,EAAE,EAAE,UAAU,CAAC,CAAC;YAC5E,OAAO,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC;YACrB,OAAO,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC;YACvB,OAAO,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC;YACrB,OAAO,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC;QACxB,CAAC;QAED,IAAI,IAAI,CAAC,QAAQ,IAAI,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,KAAK,CAAC,EAAE,CAAC;YACnD,MAAM,iBAAiB,CAAC,OAAO,EAAE,IAAI,CAAC,QAAQ,CAAC,CAAC;YAChD,IAAI,CAAC,QAAQ,GAAG,MAAM,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;QACxC,CAAC;QAED,IAAI,IAAI,CAAC,aAAa,IAAI,IAAI,CAAC,aAAa,CAAC,QAAQ,CAAC,KAAK,CAAC,EAAE,CAAC;YAC7D,MAAM,iBAAiB,CAAC,OAAO,EAAE,IAAI,CAAC,aAAa,CAAC,CAAC;YACrD,IAAI,CAAC,aAAa,GAAG,MAAM,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC;QAClD,CAAC;QAED,IAAI,IAAI,CAAC,QAAQ,EAAE,CAAC;YAClB,KAAK,MAAM,KAAK,IAAI,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,QAAQ,CAAC;gBAAE,MAAM,UAAU,CAAC,KAAK,CAAC,CAAC;QAC5E,CAAC;QACD,IAAI,IAAI,CAAC,OAAO;YAAE,MAAM,UAAU,CAAC,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;QACvD,IAAI,IAAI,CAAC,QAAQ;YAAE,MAAM,UAAU,CAAC,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC;IAC3D,CAAC;IAED,MAAM,UAAU,CAAC,SAAS,CAAC,CAAC;IAE5B,uBAAuB;IACvB,KAAK,MAAM,KAAK,IAAI,aAAa,EAAE,CAAC;QAClC,IAAI,KAAK,CAAC,UAAU,CAAC,QAAQ,CAAC,KAAK,CAAC,EAAE,CAAC;YACrC,KAAK,CAAC,UAAU,GAAG,MAAM,iBAAiB,CAAC,OAAO,EAAE,KAAK,CAAC,UAAU,EAAE,KAAK,CAAC,KAAK,CAAC,CAAC;YACnF,OAAO,KAAK,CAAC,KAAK,CAAC;QACrB,CAAC;IACH,CAAC;IAED,+BAA+B;IAC/B,MAAM,OAAO,CAAC,OAAO,CAAC,oBAAoB,EAAE;QAC1C,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,SAAS,CAAC;KAChC,CAAC,CAAC;IACH,MAAM,OAAO,CAAC,OAAO,CAAC,qBAAqB,EAAE;QAC3C,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,aAAa,CAAC;KACpC,CAAC,CAAC;AACL,CAAC;AAED,yEAAyE;AAEzE,8DAA8D;AAC9D,KAAK,UAAU,WAAW;IACxB,MAAM,eAAe,GAAG,aAAa,CAAC,OAAO,CAAC,GAAG,EAAE,GAAG,GAAG,CAAC,CAAC;IAC3D,OAAO,eAAe,CAAC,SAAS,CAAC,CAAC;AACpC,CAAC"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@emkodev/emroute",
|
|
3
|
-
"version": "1.7.
|
|
3
|
+
"version": "1.7.1-beta.2",
|
|
4
4
|
"description": "File-based (but storage-agnostic) router with triple rendering (SPA, SSR HTML, SSR Markdown). Zero dependencies.",
|
|
5
5
|
"license": "BSD-3-Clause",
|
|
6
6
|
"author": "emko.dev",
|
|
@@ -74,7 +74,78 @@ export abstract class Runtime {
|
|
|
74
74
|
|
|
75
75
|
/** Write. Defaults to PUT; pass `{ method: "DELETE" }` etc. to override. */
|
|
76
76
|
command(resource: FetchParams[0], options?: FetchParams[1]): FetchReturn {
|
|
77
|
-
|
|
77
|
+
const path = typeof resource === 'string'
|
|
78
|
+
? resource
|
|
79
|
+
: new URL(resource instanceof Request ? resource.url : resource.toString()).pathname;
|
|
80
|
+
const result = this.handle(resource, { method: 'PUT', ...options });
|
|
81
|
+
const routesDir = this.config.routesDir ?? DEFAULT_ROUTES_DIR;
|
|
82
|
+
if (path.startsWith(routesDir + '/')) {
|
|
83
|
+
return result.then(async (res) => {
|
|
84
|
+
await this.mergeRouteIntoManifest(path, routesDir);
|
|
85
|
+
return res;
|
|
86
|
+
});
|
|
87
|
+
}
|
|
88
|
+
return result;
|
|
89
|
+
}
|
|
90
|
+
|
|
91
|
+
/**
|
|
92
|
+
* Parse a single route file path and merge it into the stored manifest.
|
|
93
|
+
* Avoids a full directory rescan — just reads the current manifest,
|
|
94
|
+
* inserts the new entry, and writes it back.
|
|
95
|
+
*/
|
|
96
|
+
private async mergeRouteIntoManifest(
|
|
97
|
+
filePath: string,
|
|
98
|
+
routesDir: string,
|
|
99
|
+
): Promise<void> {
|
|
100
|
+
const relativePath = filePath.slice(routesDir.length + 1);
|
|
101
|
+
const parts = relativePath.split('/');
|
|
102
|
+
const filename = parts[parts.length - 1];
|
|
103
|
+
const dirSegments = parts.slice(0, -1);
|
|
104
|
+
|
|
105
|
+
const match = filename.match(/^(.+?)\.(page|error|redirect)\.(ts|js|html|md|css)$/);
|
|
106
|
+
if (!match) return;
|
|
107
|
+
|
|
108
|
+
const [, name, kind, ext] = match;
|
|
109
|
+
|
|
110
|
+
// Read current manifest (or start fresh)
|
|
111
|
+
const response = await this.handle(ROUTES_MANIFEST_PATH);
|
|
112
|
+
const tree: RouteNode = response.status === 404
|
|
113
|
+
? {}
|
|
114
|
+
: await response.json();
|
|
115
|
+
|
|
116
|
+
// Walk to the parent node
|
|
117
|
+
let node = tree;
|
|
118
|
+
for (const dir of dirSegments) {
|
|
119
|
+
if (dir.startsWith('[') && dir.endsWith(']')) {
|
|
120
|
+
const param = dir.slice(1, -1);
|
|
121
|
+
node.dynamic ??= { param, child: {} };
|
|
122
|
+
node = node.dynamic.child;
|
|
123
|
+
} else {
|
|
124
|
+
node.children ??= {};
|
|
125
|
+
node.children[dir] ??= {};
|
|
126
|
+
node = node.children[dir];
|
|
127
|
+
}
|
|
128
|
+
}
|
|
129
|
+
|
|
130
|
+
// Place the file
|
|
131
|
+
if (kind === 'error') {
|
|
132
|
+
node.errorBoundary = filePath;
|
|
133
|
+
} else {
|
|
134
|
+
const target = resolveTargetNode(node, name, dirSegments.length === 0);
|
|
135
|
+
if (kind === 'redirect') {
|
|
136
|
+
target.redirect = filePath;
|
|
137
|
+
} else {
|
|
138
|
+
target.files ??= {};
|
|
139
|
+
target.files[ext as keyof RouteFiles] = filePath;
|
|
140
|
+
}
|
|
141
|
+
}
|
|
142
|
+
|
|
143
|
+
// Write updated manifest back
|
|
144
|
+
this.routesManifestCache = null;
|
|
145
|
+
await this.handle(ROUTES_MANIFEST_PATH, {
|
|
146
|
+
method: 'PUT',
|
|
147
|
+
body: JSON.stringify(tree),
|
|
148
|
+
});
|
|
78
149
|
}
|
|
79
150
|
|
|
80
151
|
/**
|
package/server/build.util.ts
CHANGED
|
@@ -81,27 +81,37 @@ export async function buildClientBundles(options: BuildOptions): Promise<void> {
|
|
|
81
81
|
await runtime.command(paths.emroute, { body: emrouteJs });
|
|
82
82
|
|
|
83
83
|
// App bundle — consumer's main.ts bundled with esbuild.
|
|
84
|
+
// Try filesystem first (where node_modules lives), then runtime, then generate.
|
|
84
85
|
const ep = entryPoint ?? '/main.ts';
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
await
|
|
86
|
+
let source: string | undefined;
|
|
87
|
+
try {
|
|
88
|
+
source = await readFile(root + ep, 'utf-8');
|
|
89
|
+
} catch {
|
|
90
|
+
const epResponse = await runtime.query(ep);
|
|
91
|
+
if (epResponse.status !== 404) source = await epResponse.text();
|
|
88
92
|
}
|
|
93
|
+
source ??= generateMainTs(spa, '@emkodev/emroute');
|
|
89
94
|
|
|
90
95
|
const result = await esbuild.build({
|
|
91
96
|
bundle: true,
|
|
92
97
|
write: false,
|
|
93
98
|
format: 'esm' as const,
|
|
94
99
|
platform: 'browser' as const,
|
|
95
|
-
|
|
96
|
-
outfile:
|
|
100
|
+
stdin: { contents: source, loader: 'ts', resolveDir: root },
|
|
101
|
+
outfile: paths.app,
|
|
97
102
|
external: [...EMROUTE_EXTERNALS],
|
|
98
103
|
});
|
|
99
104
|
|
|
100
105
|
for (const file of result.outputFiles) {
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
106
|
+
await runtime.command(paths.app, { body: file.contents as unknown as BodyInit });
|
|
107
|
+
}
|
|
108
|
+
|
|
109
|
+
// Copy main.css from disk into runtime if it exists (and runtime doesn't have it)
|
|
110
|
+
if ((await runtime.query('/main.css')).status === 404) {
|
|
111
|
+
try {
|
|
112
|
+
const css = await readFile(root + '/main.css');
|
|
113
|
+
await runtime.command('/main.css', { body: css });
|
|
114
|
+
} catch { /* no main.css on disk — fine */ }
|
|
105
115
|
}
|
|
106
116
|
|
|
107
117
|
// Write shell (index.html) if not already present
|