@crvouga/mockingbird-service-paddle 1.1.0 → 1.2.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/CHANGELOG.md +10 -4
- package/dist/{chunk-KKBYL4V7.js → chunk-DQJGCXZU.js} +75 -6
- package/dist/chunk-DQJGCXZU.js.map +7 -0
- package/dist/{chunk-6KIZNYVU.js → chunk-NRRS7CYQ.js} +2 -2
- package/dist/cli.js +2 -2
- package/dist/index.js +1 -1
- package/dist/server.js +2 -2
- package/package.json +1 -1
- package/dist/chunk-KKBYL4V7.js.map +0 -7
- /package/dist/{chunk-6KIZNYVU.js.map → chunk-NRRS7CYQ.js.map} +0 -0
package/CHANGELOG.md
CHANGED
|
@@ -1,5 +1,15 @@
|
|
|
1
1
|
# Changelog — @crvouga/mockingbird-service-paddle
|
|
2
2
|
|
|
3
|
+
## 1.2.0 (2026-10-05)
|
|
4
|
+
|
|
5
|
+
### Features
|
|
6
|
+
|
|
7
|
+
- add scripted local API mock ([4a76a11](https://github.com/crvouga/mockingbird/commit/4a76a114e2efad45934e0a93cf29576fd418e15c))
|
|
8
|
+
|
|
9
|
+
### Fixes and improvements
|
|
10
|
+
|
|
11
|
+
- support embedded route parameters ([127cad9](https://github.com/crvouga/mockingbird/commit/127cad997ef106950c1b866070eea191ba54403f))
|
|
12
|
+
|
|
3
13
|
## 1.1.0 (2026-10-04)
|
|
4
14
|
|
|
5
15
|
### Features
|
|
@@ -12,10 +22,6 @@
|
|
|
12
22
|
- fill the embedded viewport ([c1a35a4](https://github.com/crvouga/mockingbird/commit/c1a35a4789389ee9cd06c286d09bd47c4d06c71e))
|
|
13
23
|
- make dialog cleanup immediate ([0c1a3c5](https://github.com/crvouga/mockingbird/commit/0c1a3c5b12584d50c19dcae595b951b8e5417b9c))
|
|
14
24
|
|
|
15
|
-
### Dependencies
|
|
16
|
-
|
|
17
|
-
- `@crvouga/mockingbird-service-sqlite`
|
|
18
|
-
|
|
19
25
|
## 1.0.0 (2026-10-04)
|
|
20
26
|
|
|
21
27
|
### ⚠️ Breaking changes
|
|
@@ -1018,7 +1018,40 @@ var decodeBody = (contentType, bytes) => {
|
|
|
1018
1018
|
return { kind: "bytes", value: bytes };
|
|
1019
1019
|
};
|
|
1020
1020
|
var readBody = async (message) => {
|
|
1021
|
-
|
|
1021
|
+
if (!(message instanceof Request) || !message.body) {
|
|
1022
|
+
if (message instanceof Request)
|
|
1023
|
+
message.signal.throwIfAborted();
|
|
1024
|
+
return decodeBody(message.headers.get("content-type"), new Uint8Array(await message.arrayBuffer()));
|
|
1025
|
+
}
|
|
1026
|
+
message.signal.throwIfAborted();
|
|
1027
|
+
const reader = message.body.getReader();
|
|
1028
|
+
const cancel = () => {
|
|
1029
|
+
void reader.cancel(message.signal.reason).catch(() => {
|
|
1030
|
+
});
|
|
1031
|
+
};
|
|
1032
|
+
message.signal.addEventListener("abort", cancel, { once: true });
|
|
1033
|
+
const chunks = [];
|
|
1034
|
+
let size = 0;
|
|
1035
|
+
try {
|
|
1036
|
+
for (; ; ) {
|
|
1037
|
+
message.signal.throwIfAborted();
|
|
1038
|
+
const { done, value } = await reader.read();
|
|
1039
|
+
message.signal.throwIfAborted();
|
|
1040
|
+
if (done)
|
|
1041
|
+
break;
|
|
1042
|
+
chunks.push(value);
|
|
1043
|
+
size += value.byteLength;
|
|
1044
|
+
}
|
|
1045
|
+
} finally {
|
|
1046
|
+
message.signal.removeEventListener("abort", cancel);
|
|
1047
|
+
reader.releaseLock();
|
|
1048
|
+
}
|
|
1049
|
+
const bytes = new Uint8Array(size);
|
|
1050
|
+
let offset = 0;
|
|
1051
|
+
for (const chunk of chunks) {
|
|
1052
|
+
bytes.set(chunk, offset);
|
|
1053
|
+
offset += chunk.byteLength;
|
|
1054
|
+
}
|
|
1022
1055
|
return decodeBody(message.headers.get("content-type"), bytes);
|
|
1023
1056
|
};
|
|
1024
1057
|
|
|
@@ -1734,7 +1767,42 @@ var verifyOperations = (document2, handlers) => {
|
|
|
1734
1767
|
}
|
|
1735
1768
|
return problems;
|
|
1736
1769
|
};
|
|
1737
|
-
var
|
|
1770
|
+
var escapePattern = (value) => value.replace(/[.*+?^${}()|[\]\\]/g, "\\$&");
|
|
1771
|
+
var serviceRoute = (template) => {
|
|
1772
|
+
const names = [];
|
|
1773
|
+
let pattern = "", end = 0;
|
|
1774
|
+
for (const match of template.matchAll(/\{([^}]+)\}/g)) {
|
|
1775
|
+
pattern += `${escapePattern(template.slice(end, match.index))}([^/]+?)`;
|
|
1776
|
+
const name = match[1];
|
|
1777
|
+
if (!name)
|
|
1778
|
+
throw new Error(`Invalid OpenAPI route template: ${template}`);
|
|
1779
|
+
names.push(name);
|
|
1780
|
+
end = match.index + match[0].length;
|
|
1781
|
+
}
|
|
1782
|
+
pattern += escapePattern(template.slice(end));
|
|
1783
|
+
const matcher = new RegExp(`^${pattern}$`);
|
|
1784
|
+
const path = template.split("/").map((segment, index) => {
|
|
1785
|
+
if (!segment.includes("{"))
|
|
1786
|
+
return segment;
|
|
1787
|
+
const literal = /^\{([^}]+)\}$/.exec(segment);
|
|
1788
|
+
if (literal)
|
|
1789
|
+
return `:${literal[1]}`;
|
|
1790
|
+
let expression = "", offset = 0;
|
|
1791
|
+
for (const match of segment.matchAll(/\{[^}]+\}/g)) {
|
|
1792
|
+
expression += `${escapePattern(segment.slice(offset, match.index))}[^/]+?`;
|
|
1793
|
+
offset = match.index + match[0].length;
|
|
1794
|
+
}
|
|
1795
|
+
expression += escapePattern(segment.slice(offset));
|
|
1796
|
+
return `:mockingbirdSegment${index}{${expression}}`;
|
|
1797
|
+
}).join("/");
|
|
1798
|
+
return {
|
|
1799
|
+
path,
|
|
1800
|
+
params: (pathname) => {
|
|
1801
|
+
const values = matcher.exec(pathname);
|
|
1802
|
+
return Object.fromEntries(names.map((name, index) => [name, decodeURIComponent(values?.[index + 1] ?? "")]));
|
|
1803
|
+
}
|
|
1804
|
+
};
|
|
1805
|
+
};
|
|
1738
1806
|
var routeOrder = (a, b) => {
|
|
1739
1807
|
const sa = a.path.split("/");
|
|
1740
1808
|
const sb = b.path.split("/");
|
|
@@ -1769,6 +1837,7 @@ var createService = (options) => {
|
|
|
1769
1837
|
for (const operation of operations) {
|
|
1770
1838
|
const metadata = operationMetadata(operation.operation);
|
|
1771
1839
|
const handler = options.handlers[operation.operationId];
|
|
1840
|
+
const registeredRoute = serviceRoute(operation.path);
|
|
1772
1841
|
const route = async (c) => {
|
|
1773
1842
|
const request = c.req.raw;
|
|
1774
1843
|
if (!metadata.supported || !handler) {
|
|
@@ -1778,7 +1847,7 @@ var createService = (options) => {
|
|
|
1778
1847
|
const context = {
|
|
1779
1848
|
request,
|
|
1780
1849
|
url,
|
|
1781
|
-
params:
|
|
1850
|
+
params: registeredRoute.params(url.pathname),
|
|
1782
1851
|
query: queryOf(url),
|
|
1783
1852
|
body: await readBody(request),
|
|
1784
1853
|
sqlite: options.sqlite,
|
|
@@ -1790,7 +1859,7 @@ var createService = (options) => {
|
|
|
1790
1859
|
const short = await options.before?.(context);
|
|
1791
1860
|
return withIssues(request, short ?? await handler(context));
|
|
1792
1861
|
};
|
|
1793
|
-
app.on(operation.method.toUpperCase(),
|
|
1862
|
+
app.on(operation.method.toUpperCase(), registeredRoute.path, route);
|
|
1794
1863
|
}
|
|
1795
1864
|
return {
|
|
1796
1865
|
app,
|
|
@@ -2259,7 +2328,7 @@ var stateAdminRoutes = (routes) => {
|
|
|
2259
2328
|
};
|
|
2260
2329
|
|
|
2261
2330
|
// ../core/dist/version.js
|
|
2262
|
-
var PACKAGE_VERSION = true ? "1.
|
|
2331
|
+
var PACKAGE_VERSION = true ? "1.2.0" : UNRELEASED_VERSION;
|
|
2263
2332
|
|
|
2264
2333
|
// ../core/dist/signing.js
|
|
2265
2334
|
var encoder = new TextEncoder();
|
|
@@ -6142,4 +6211,4 @@ export {
|
|
|
6142
6211
|
AUTH_TOKEN_TTL_MS,
|
|
6143
6212
|
PaddleAPI
|
|
6144
6213
|
};
|
|
6145
|
-
//# sourceMappingURL=chunk-
|
|
6214
|
+
//# sourceMappingURL=chunk-DQJGCXZU.js.map
|