@atlasauth/emulator-core 0.1.0 → 0.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.
Files changed (111) hide show
  1. package/dist/adopt.d.ts +50 -0
  2. package/dist/adopt.js +57 -0
  3. package/dist/adopt.js.map +1 -0
  4. package/dist/coverage.d.ts +15 -0
  5. package/dist/coverage.js +31 -0
  6. package/dist/coverage.js.map +1 -0
  7. package/dist/crypto-util.d.ts +10 -0
  8. package/dist/crypto-util.js +76 -0
  9. package/dist/crypto-util.js.map +1 -0
  10. package/dist/engine.d.ts +33 -2
  11. package/dist/engine.js +53 -8
  12. package/dist/engine.js.map +1 -1
  13. package/dist/error-catalog.js +8 -0
  14. package/dist/error-catalog.js.map +1 -1
  15. package/dist/event-gate.d.ts +3 -0
  16. package/dist/event-gate.js +372 -0
  17. package/dist/event-gate.js.map +1 -0
  18. package/dist/generic.js +9 -1
  19. package/dist/generic.js.map +1 -1
  20. package/dist/handlers/approvals.d.ts +2 -0
  21. package/dist/handlers/approvals.js +365 -0
  22. package/dist/handlers/approvals.js.map +1 -0
  23. package/dist/handlers/authz.d.ts +2 -0
  24. package/dist/handlers/authz.js +347 -0
  25. package/dist/handlers/authz.js.map +1 -0
  26. package/dist/handlers/billing.d.ts +2 -0
  27. package/dist/handlers/billing.js +398 -0
  28. package/dist/handlers/billing.js.map +1 -0
  29. package/dist/handlers/connections.d.ts +2 -0
  30. package/dist/handlers/connections.js +332 -0
  31. package/dist/handlers/connections.js.map +1 -0
  32. package/dist/handlers/device.d.ts +47 -0
  33. package/dist/handlers/device.js +648 -0
  34. package/dist/handlers/device.js.map +1 -0
  35. package/dist/handlers/federation.d.ts +2 -0
  36. package/dist/handlers/federation.js +481 -0
  37. package/dist/handlers/federation.js.map +1 -0
  38. package/dist/handlers/governance.d.ts +2 -0
  39. package/dist/handlers/governance.js +460 -0
  40. package/dist/handlers/governance.js.map +1 -0
  41. package/dist/handlers/hooks.js +4 -1
  42. package/dist/handlers/hooks.js.map +1 -1
  43. package/dist/handlers/index.d.ts +5 -1
  44. package/dist/handlers/index.js +32 -3
  45. package/dist/handlers/index.js.map +1 -1
  46. package/dist/handlers/keys.js +6 -1
  47. package/dist/handlers/keys.js.map +1 -1
  48. package/dist/handlers/machines.js +55 -8
  49. package/dist/handlers/machines.js.map +1 -1
  50. package/dist/handlers/messaging.d.ts +4 -0
  51. package/dist/handlers/messaging.js +486 -0
  52. package/dist/handlers/messaging.js.map +1 -0
  53. package/dist/handlers/oauth-flows.d.ts +28 -0
  54. package/dist/handlers/oauth-flows.js +419 -0
  55. package/dist/handlers/oauth-flows.js.map +1 -0
  56. package/dist/handlers/oauth.d.ts +75 -0
  57. package/dist/handlers/oauth.js +608 -0
  58. package/dist/handlers/oauth.js.map +1 -0
  59. package/dist/handlers/passkeys.d.ts +3 -0
  60. package/dist/handlers/passkeys.js +293 -0
  61. package/dist/handlers/passkeys.js.map +1 -0
  62. package/dist/handlers/platform.d.ts +15 -0
  63. package/dist/handlers/platform.js +454 -0
  64. package/dist/handlers/platform.js.map +1 -0
  65. package/dist/handlers/round2.d.ts +8 -0
  66. package/dist/handlers/round2.js +372 -0
  67. package/dist/handlers/round2.js.map +1 -0
  68. package/dist/handlers/scim.d.ts +2 -0
  69. package/dist/handlers/scim.js +408 -0
  70. package/dist/handlers/scim.js.map +1 -0
  71. package/dist/handlers/sessions.d.ts +7 -3
  72. package/dist/handlers/sessions.js +55 -25
  73. package/dist/handlers/sessions.js.map +1 -1
  74. package/dist/handlers/support.d.ts +20 -0
  75. package/dist/handlers/support.js +62 -0
  76. package/dist/handlers/support.js.map +1 -0
  77. package/dist/handlers/users.js +4 -0
  78. package/dist/handlers/users.js.map +1 -1
  79. package/dist/handlers/workflows.d.ts +2 -0
  80. package/dist/handlers/workflows.js +428 -0
  81. package/dist/handlers/workflows.js.map +1 -0
  82. package/dist/index.d.ts +8 -0
  83. package/dist/index.js +23 -1
  84. package/dist/index.js.map +1 -1
  85. package/dist/jws.d.ts +41 -0
  86. package/dist/jws.js +133 -0
  87. package/dist/jws.js.map +1 -0
  88. package/dist/messages.d.ts +7 -0
  89. package/dist/messages.js +8 -4
  90. package/dist/messages.js.map +1 -1
  91. package/dist/parity-bin.js +3 -1
  92. package/dist/parity-bin.js.map +1 -1
  93. package/dist/parity-routes.d.ts +14 -0
  94. package/dist/parity-routes.js +421 -0
  95. package/dist/parity-routes.js.map +1 -0
  96. package/dist/parity.d.ts +10 -3
  97. package/dist/parity.js +14 -5
  98. package/dist/parity.js.map +1 -1
  99. package/dist/tokens.d.ts +17 -0
  100. package/dist/tokens.js +46 -0
  101. package/dist/tokens.js.map +1 -1
  102. package/dist/webauthn-virtual.d.ts +70 -0
  103. package/dist/webauthn-virtual.js +186 -0
  104. package/dist/webauthn-virtual.js.map +1 -0
  105. package/dist/webhook-ext.d.ts +16 -0
  106. package/dist/webhook-ext.js +218 -0
  107. package/dist/webhook-ext.js.map +1 -0
  108. package/dist/webhooks.d.ts +3 -0
  109. package/dist/webhooks.js +37 -3
  110. package/dist/webhooks.js.map +1 -1
  111. package/package.json +2 -2
package/dist/jws.js ADDED
@@ -0,0 +1,133 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.DPOP_IAT_WINDOW_S = exports.globMatch = exports.SUPPORTED_ALGS = exports.b64urlDecode = void 0;
4
+ exports.decodeJwt = decodeJwt;
5
+ exports.verifyJws = verifyJws;
6
+ exports.jwkThumbprintOf = jwkThumbprintOf;
7
+ exports.verifyDpopProof = verifyDpopProof;
8
+ exports.forwardedCertThumbprint = forwardedCertThumbprint;
9
+ /* eslint-disable @typescript-eslint/no-explicit-any */
10
+ const crypto_util_1 = require("./crypto-util");
11
+ /** JWS and DPoP helpers on Web Crypto only (no node:crypto), so the engine still runs in a browser worker. */
12
+ const b64urlDecode = (s) => {
13
+ const pad = s.replace(/-/g, '+').replace(/_/g, '/');
14
+ return Uint8Array.from(atob(pad + '='.repeat((4 - (pad.length % 4)) % 4)), (c) => c.charCodeAt(0));
15
+ };
16
+ exports.b64urlDecode = b64urlDecode;
17
+ const text = (s) => new TextDecoder().decode((0, exports.b64urlDecode)(s));
18
+ /** Split and parse a compact JWS; null when it is not one. Does not verify anything. */
19
+ function decodeJwt(token) {
20
+ const parts = token.split('.');
21
+ if (parts.length !== 3 || parts.some((p) => !p))
22
+ return null;
23
+ try {
24
+ const header = JSON.parse(text(parts[0]));
25
+ const payload = JSON.parse(text(parts[1]));
26
+ if (!header || typeof header !== 'object' || !payload || typeof payload !== 'object')
27
+ return null;
28
+ return { header, payload, signingInput: `${parts[0]}.${parts[1]}`, signature: (0, exports.b64urlDecode)(parts[2]) };
29
+ }
30
+ catch {
31
+ return null;
32
+ }
33
+ }
34
+ const hashOf = (bits) => `SHA-${bits}`;
35
+ const ALGS = {
36
+ ES256: { import: { name: 'ECDSA', namedCurve: 'P-256' }, verify: { name: 'ECDSA', hash: hashOf('256') } },
37
+ ES384: { import: { name: 'ECDSA', namedCurve: 'P-384' }, verify: { name: 'ECDSA', hash: hashOf('384') } },
38
+ RS256: { import: { name: 'RSASSA-PKCS1-v1_5', hash: hashOf('256') }, verify: { name: 'RSASSA-PKCS1-v1_5' } },
39
+ RS384: { import: { name: 'RSASSA-PKCS1-v1_5', hash: hashOf('384') }, verify: { name: 'RSASSA-PKCS1-v1_5' } },
40
+ RS512: { import: { name: 'RSASSA-PKCS1-v1_5', hash: hashOf('512') }, verify: { name: 'RSASSA-PKCS1-v1_5' } },
41
+ PS256: { import: { name: 'RSA-PSS', hash: hashOf('256') }, verify: { name: 'RSA-PSS', saltLength: 32 } },
42
+ EdDSA: { import: { name: 'Ed25519' }, verify: { name: 'Ed25519' } },
43
+ };
44
+ exports.SUPPORTED_ALGS = Object.keys(ALGS);
45
+ /** Verify a JWS signature with a public JWK. Never throws; a private-key JWK is refused. */
46
+ async function verifyJws(jwt, jwk) {
47
+ const spec = ALGS[String(jwt.header.alg)];
48
+ if (!spec || 'd' in jwk || 'k' in jwk)
49
+ return false;
50
+ try {
51
+ const key = await crypto.subtle.importKey('jwk', { ...jwk, alg: undefined, use: undefined, key_ops: undefined }, spec.import, false, ['verify']);
52
+ return await crypto.subtle.verify(spec.verify, key, jwt.signature, new TextEncoder().encode(jwt.signingInput));
53
+ }
54
+ catch {
55
+ return false;
56
+ }
57
+ }
58
+ const THUMB_KEYS = { EC: ['crv', 'kty', 'x', 'y'], RSA: ['e', 'kty', 'n'], OKP: ['crv', 'kty', 'x'] };
59
+ /** RFC 7638 thumbprint of a public JWK (base64url SHA-256); null for a key type the engine does not read. */
60
+ async function jwkThumbprintOf(jwk) {
61
+ const keys = THUMB_KEYS[String(jwk.kty)];
62
+ if (!keys || keys.some((k) => typeof jwk[k] !== 'string'))
63
+ return null;
64
+ return (0, crypto_util_1.bytesToB64url)(await (0, crypto_util_1.sha256)(JSON.stringify(Object.fromEntries(keys.map((k) => [k, jwk[k]])))));
65
+ }
66
+ /** `*` any run of characters, `?` one character; anchored. */
67
+ const globMatch = (pattern, value) => new RegExp(`^${pattern.replace(/[.+^${}()|[\]\\]/g, '\\$&').replace(/\*/g, '.*').replace(/\?/g, '.')}$`, 's').test(value);
68
+ exports.globMatch = globMatch;
69
+ exports.DPOP_IAT_WINDOW_S = 300;
70
+ const stripUrl = (u) => {
71
+ const x = new URL(u);
72
+ return `${x.protocol}//${x.host}${x.pathname}`;
73
+ };
74
+ /** Validate a DPoP proof per RFC 9449. Returns the key thumbprint and jti, or throws Error(reason). Replay (jti) is the caller's. */
75
+ async function verifyDpopProof(c) {
76
+ const jwt = decodeJwt(c.proof);
77
+ if (!jwt)
78
+ throw new Error('The DPoP proof is not a JWT.');
79
+ const { header, payload } = jwt;
80
+ if (header.typ !== 'dpop+jwt')
81
+ throw new Error('The DPoP proof typ must be dpop+jwt.');
82
+ if (!(String(header.alg) in ALGS))
83
+ throw new Error('The DPoP proof alg is not an asymmetric algorithm this server accepts.');
84
+ const jwk = header.jwk;
85
+ if (!jwk || typeof jwk !== 'object' || 'd' in jwk)
86
+ throw new Error('The DPoP proof header must carry a public jwk.');
87
+ if (!(await verifyJws(jwt, jwk)))
88
+ throw new Error('The DPoP proof signature does not verify against its jwk.');
89
+ if (typeof payload.jti !== 'string' || !payload.jti)
90
+ throw new Error('The DPoP proof needs a jti.');
91
+ if (String(payload.htm).toUpperCase() !== c.htm.toUpperCase())
92
+ throw new Error('The DPoP proof htm does not match the request method.');
93
+ if (typeof payload.htu !== 'string' || stripUrl(payload.htu) !== stripUrl(c.htu))
94
+ throw new Error('The DPoP proof htu does not match the request URL.');
95
+ if (typeof payload.iat !== 'number' || Math.abs(c.nowMs / 1000 - payload.iat) > exports.DPOP_IAT_WINDOW_S)
96
+ throw new Error('The DPoP proof iat is outside the accepted window.');
97
+ if (c.nonce !== undefined && payload.nonce !== c.nonce)
98
+ throw new Error('The DPoP proof nonce is missing or wrong.');
99
+ if (c.accessToken !== undefined && payload.ath !== (0, crypto_util_1.bytesToB64url)(await (0, crypto_util_1.sha256)(c.accessToken)))
100
+ throw new Error('The DPoP proof ath does not match the access token.');
101
+ const jkt = await jwkThumbprintOf(jwk);
102
+ if (!jkt)
103
+ throw new Error('The DPoP proof jwk is not a key type this server reads.');
104
+ return { jkt, jti: payload.jti, iat: payload.iat };
105
+ }
106
+ /**
107
+ * The client certificate thumbprint (`x5t#S256`) a trusted edge forwarded, for mTLS binding. The emulator has no TLS, so
108
+ * it reads what a proxy would set: `x-client-cert` (PEM, optionally URL-encoded) or `x-client-cert-sha256` (the
109
+ * fingerprint, hex or base64url). Returns undefined when neither is present, null when one is present but unreadable.
110
+ */
111
+ async function forwardedCertThumbprint(headers) {
112
+ const pem = headers.get('x-client-cert');
113
+ if (pem) {
114
+ try {
115
+ const body = decodeURIComponent(pem).replace(/-----[A-Z ]+-----/g, '').replace(/\s+/g, '');
116
+ const der = Uint8Array.from(atob(body), (ch) => ch.charCodeAt(0));
117
+ if (!der.length)
118
+ return null;
119
+ return (0, crypto_util_1.bytesToB64url)(await (0, crypto_util_1.sha256)(der));
120
+ }
121
+ catch {
122
+ return null;
123
+ }
124
+ }
125
+ const fp = headers.get('x-client-cert-sha256');
126
+ if (!fp)
127
+ return undefined;
128
+ const hex = fp.replace(/:/g, '');
129
+ if (/^[0-9a-fA-F]{64}$/.test(hex))
130
+ return (0, crypto_util_1.bytesToB64url)(Uint8Array.from(hex.match(/../g).map((h) => parseInt(h, 16))));
131
+ return /^[A-Za-z0-9_-]{43}$/.test(fp) ? fp : null;
132
+ }
133
+ //# sourceMappingURL=jws.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"jws.js","sourceRoot":"","sources":["../src/jws.ts"],"names":[],"mappings":"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"}
@@ -21,9 +21,16 @@ export interface MessageQuery {
21
21
  * The universal message sink: everything the engine would have sent (email, SMS, WhatsApp, voice, push)
22
22
  * lands here instead. Read it with `GET /__emulator/messages` or `engine.messages`.
23
23
  */
24
+ /** What the messaging layer decides for one outgoing message before it is sunk. `done` gets the sunk copy, or null when it was not delivered. */
25
+ export interface MessagePlan {
26
+ deliver: boolean;
27
+ done?: (sunk: SunkMessage | null) => void;
28
+ }
24
29
  export declare class MessageSink {
25
30
  private readonly clock;
26
31
  readonly messages: SunkMessage[];
32
+ /** Suppression, provider failover and the message ledger plug in here (see handlers/messaging.ts); unset, every message is delivered. */
33
+ route?: (m: Omit<SunkMessage, 'id' | 'at'>) => MessagePlan;
27
34
  private waiters;
28
35
  constructor(clock: Clock);
29
36
  send(m: Omit<SunkMessage, 'id' | 'at'>): SunkMessage;
package/dist/messages.js CHANGED
@@ -1,18 +1,21 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.MessageSink = void 0;
4
- /**
5
- * The universal message sink: everything the engine would have sent (email, SMS, WhatsApp, voice, push)
6
- * lands here instead. Read it with `GET /__emulator/messages` or `engine.messages`.
7
- */
8
4
  class MessageSink {
9
5
  clock;
10
6
  messages = [];
7
+ /** Suppression, provider failover and the message ledger plug in here (see handlers/messaging.ts); unset, every message is delivered. */
8
+ route;
11
9
  waiters = [];
12
10
  constructor(clock) {
13
11
  this.clock = clock;
14
12
  }
15
13
  send(m) {
14
+ const plan = this.route?.(m);
15
+ if (plan && !plan.deliver) {
16
+ plan.done?.(null);
17
+ return { id: 0, at: new Date(this.clock.now()).toISOString(), ...m, meta: { ...(m.meta ?? {}), undelivered: true } };
18
+ }
16
19
  const full = { id: this.messages.length + 1, at: new Date(this.clock.now()).toISOString(), ...m };
17
20
  this.messages.push(full);
18
21
  for (const w of [...this.waiters]) {
@@ -22,6 +25,7 @@ class MessageSink {
22
25
  w.resolve(full);
23
26
  }
24
27
  }
28
+ plan?.done?.(full);
25
29
  return full;
26
30
  }
27
31
  matches(m, q) {
@@ -1 +1 @@
1
- {"version":3,"file":"messages.js","sourceRoot":"","sources":["../src/messages.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"messages.js","sourceRoot":"","sources":["../src/messages.ts"],"names":[],"mappings":"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"}
@@ -8,9 +8,11 @@ Object.defineProperty(exports, "__esModule", { value: true });
8
8
  * EMULATOR_SECRET_KEY its secret key (default sk_test_emulator)
9
9
  * PARITY_BASE_URL the real Atlas Backend API to compare against (a development instance)
10
10
  * PARITY_SECRET_KEY its secret key
11
+ * PARITY_GROUPS comma list of feature groups to run (oauth,scim,agents,passkeys,device,round2); default all
11
12
  * Exit code 1 when any request differs. Run it on CI, never against production data.
12
13
  */
13
14
  const parity_1 = require("./parity");
15
+ const parity_routes_1 = require("./parity-routes");
14
16
  const server_1 = require("./server");
15
17
  async function main() {
16
18
  const refUrl = process.env.PARITY_BASE_URL;
@@ -31,7 +33,7 @@ async function main() {
31
33
  url = s.url;
32
34
  close = s.close;
33
35
  }
34
- const results = await (0, parity_1.runParity)({ requests: parity_1.defaultParityRequests, emulator: { baseUrl: url, secretKey: key }, reference: { baseUrl: refUrl, secretKey: refKey } });
36
+ const results = await (0, parity_1.runParity)({ requests: parity_routes_1.fullParityRequests, groups: process.env.PARITY_GROUPS?.split(',').filter(Boolean), emulator: { baseUrl: url, secretKey: key }, reference: { baseUrl: refUrl, secretKey: refKey } });
35
37
  await close?.();
36
38
  let bad = 0;
37
39
  for (const r of results) {
@@ -1 +1 @@
1
- {"version":3,"file":"parity-bin.js","sourceRoot":"","sources":["../src/parity-bin.ts"],"names":[],"mappings":";;;AACA;;;;;;;;GAQG;AACH,qCAA4D;AAC5D,qCAA+C;AAE/C,KAAK,UAAU,IAAI;IACjB,MAAM,MAAM,GAAG,OAAO,CAAC,GAAG,CAAC,eAAe,CAAC;IAC3C,MAAM,MAAM,GAAG,OAAO,CAAC,GAAG,CAAC,iBAAiB,CAAC;IAC7C,IAAI,CAAC,MAAM,IAAI,CAAC,MAAM,EAAE,CAAC;QACvB,OAAO,CAAC,KAAK,CAAC,+EAA+E,CAAC,CAAC;QAC/F,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;IACD,IAAI,GAAG,GAAG,OAAO,CAAC,GAAG,CAAC,YAAY,CAAC;IACnC,IAAI,KAAwC,CAAC;IAC7C,MAAM,GAAG,GAAG,OAAO,CAAC,GAAG,CAAC,mBAAmB,IAAI,kBAAkB,CAAC;IAClE,IAAI,CAAC,GAAG,EAAE,CAAC;QACT,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,aAAa,EAAE,CAAC;YAC/B,OAAO,CAAC,KAAK,CAAC,kDAAkD,CAAC,CAAC;YAClE,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAClB,CAAC;QACD,MAAM,CAAC,GAAG,MAAM,IAAA,4BAAmB,EAAC,EAAE,OAAO,EAAE,OAAO,CAAC,GAAG,CAAC,aAAa,EAAE,UAAU,EAAE,GAAG,EAAE,CAAC,CAAC;QAC7F,GAAG,GAAG,CAAC,CAAC,GAAG,CAAC;QACZ,KAAK,GAAG,CAAC,CAAC,KAAK,CAAC;IAClB,CAAC;IACD,MAAM,OAAO,GAAG,MAAM,IAAA,kBAAS,EAAC,EAAE,QAAQ,EAAE,8BAAqB,EAAE,QAAQ,EAAE,EAAE,OAAO,EAAE,GAAG,EAAE,SAAS,EAAE,GAAG,EAAE,EAAE,SAAS,EAAE,EAAE,OAAO,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,EAAE,CAAC,CAAC;IACpK,MAAM,KAAK,EAAE,EAAE,CAAC;IAChB,IAAI,GAAG,GAAG,CAAC,CAAC;IACZ,KAAK,MAAM,CAAC,IAAI,OAAO,EAAE,CAAC;QACxB,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,MAAM,IAAI,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC,MAAM,CAAC,QAAQ,IAAI,CAAC,CAAC,MAAM,CAAC,SAAS,GAAG,CAAC,CAAC;QAC9F,KAAK,MAAM,CAAC,IAAI,CAAC,CAAC,KAAK;YAAE,OAAO,CAAC,GAAG,CAAC,UAAU,CAAC,EAAE,CAAC,CAAC;QACpD,IAAI,CAAC,CAAC,CAAC,EAAE;YAAE,GAAG,EAAE,CAAC;IACnB,CAAC;IACD,OAAO,CAAC,GAAG,CAAC,KAAK,OAAO,CAAC,MAAM,GAAG,GAAG,IAAI,OAAO,CAAC,MAAM,SAAS,CAAC,CAAC;IAClE,OAAO,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;AAC5B,CAAC;AAED,KAAK,IAAI,EAAE,CAAC"}
1
+ {"version":3,"file":"parity-bin.js","sourceRoot":"","sources":["../src/parity-bin.ts"],"names":[],"mappings":";;;AACA;;;;;;;;;GASG;AACH,qCAAqC;AACrC,mDAAqD;AACrD,qCAA+C;AAE/C,KAAK,UAAU,IAAI;IACjB,MAAM,MAAM,GAAG,OAAO,CAAC,GAAG,CAAC,eAAe,CAAC;IAC3C,MAAM,MAAM,GAAG,OAAO,CAAC,GAAG,CAAC,iBAAiB,CAAC;IAC7C,IAAI,CAAC,MAAM,IAAI,CAAC,MAAM,EAAE,CAAC;QACvB,OAAO,CAAC,KAAK,CAAC,+EAA+E,CAAC,CAAC;QAC/F,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;IACD,IAAI,GAAG,GAAG,OAAO,CAAC,GAAG,CAAC,YAAY,CAAC;IACnC,IAAI,KAAwC,CAAC;IAC7C,MAAM,GAAG,GAAG,OAAO,CAAC,GAAG,CAAC,mBAAmB,IAAI,kBAAkB,CAAC;IAClE,IAAI,CAAC,GAAG,EAAE,CAAC;QACT,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,aAAa,EAAE,CAAC;YAC/B,OAAO,CAAC,KAAK,CAAC,kDAAkD,CAAC,CAAC;YAClE,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAClB,CAAC;QACD,MAAM,CAAC,GAAG,MAAM,IAAA,4BAAmB,EAAC,EAAE,OAAO,EAAE,OAAO,CAAC,GAAG,CAAC,aAAa,EAAE,UAAU,EAAE,GAAG,EAAE,CAAC,CAAC;QAC7F,GAAG,GAAG,CAAC,CAAC,GAAG,CAAC;QACZ,KAAK,GAAG,CAAC,CAAC,KAAK,CAAC;IAClB,CAAC;IACD,MAAM,OAAO,GAAG,MAAM,IAAA,kBAAS,EAAC,EAAE,QAAQ,EAAE,kCAAkB,EAAE,MAAM,EAAE,OAAO,CAAC,GAAG,CAAC,aAAa,EAAE,KAAK,CAAC,GAAG,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,EAAE,QAAQ,EAAE,EAAE,OAAO,EAAE,GAAG,EAAE,SAAS,EAAE,GAAG,EAAE,EAAE,SAAS,EAAE,EAAE,OAAO,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,EAAE,CAAC,CAAC;IAChO,MAAM,KAAK,EAAE,EAAE,CAAC;IAChB,IAAI,GAAG,GAAG,CAAC,CAAC;IACZ,KAAK,MAAM,CAAC,IAAI,OAAO,EAAE,CAAC;QACxB,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,MAAM,IAAI,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC,MAAM,CAAC,QAAQ,IAAI,CAAC,CAAC,MAAM,CAAC,SAAS,GAAG,CAAC,CAAC;QAC9F,KAAK,MAAM,CAAC,IAAI,CAAC,CAAC,KAAK;YAAE,OAAO,CAAC,GAAG,CAAC,UAAU,CAAC,EAAE,CAAC,CAAC;QACpD,IAAI,CAAC,CAAC,CAAC,EAAE;YAAE,GAAG,EAAE,CAAC;IACnB,CAAC;IACD,OAAO,CAAC,GAAG,CAAC,KAAK,OAAO,CAAC,MAAM,GAAG,GAAG,IAAI,OAAO,CAAC,MAAM,SAAS,CAAC,CAAC;IAClE,OAAO,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;AAC5B,CAAC;AAED,KAAK,IAAI,EAAE,CAAC"}
@@ -0,0 +1,14 @@
1
+ import { type ParityRequest } from './parity';
2
+ import type { Engine } from './engine';
3
+ export declare const extraParityRequests: ParityRequest[];
4
+ /**
5
+ * The routes of the machine federation, OAuth flows, approvals, governance, messaging, billing, hooks, platform and
6
+ * connection work. Requests that need a feature or a catalogue the reference instance may not have carry a `group`.
7
+ */
8
+ export declare const waveParityRequests: ParityRequest[];
9
+ /** Every request: the first-round list, then the rest. */
10
+ export declare const fullParityRequests: ParityRequest[];
11
+ /** Hand-written routes parity deliberately does not send to a real instance, each with the reason. */
12
+ export declare const PARITY_EXEMPT: Record<string, string>;
13
+ /** Routes the emulator answers by hand that no parity request exercises, as `METHOD /pattern` (`/__emulator` routes are the engine's own surface and do not exist on a real instance). */
14
+ export declare function uncoveredRoutes(engine: Engine, requests?: ParityRequest[]): string[];