@portaidentity/sdk 1.7.3 → 1.8.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 (116) hide show
  1. package/CHANGELOG.md +5 -0
  2. package/README.md +70 -41
  3. package/dist/agent.d.ts +15 -1
  4. package/dist/agent.d.ts.map +1 -1
  5. package/dist/agent.js +473 -69
  6. package/dist/agent.js.map +1 -1
  7. package/dist/auth/cli-auth.d.ts +45 -71
  8. package/dist/auth/cli-auth.d.ts.map +1 -1
  9. package/dist/auth/cli-auth.js +208 -144
  10. package/dist/auth/cli-auth.js.map +1 -1
  11. package/dist/auth/index.d.ts +1 -1
  12. package/dist/auth/index.d.ts.map +1 -1
  13. package/dist/domains/applications.d.ts +22 -3
  14. package/dist/domains/applications.d.ts.map +1 -1
  15. package/dist/domains/applications.js +90 -20
  16. package/dist/domains/applications.js.map +1 -1
  17. package/dist/domains/branding.d.ts +47 -16
  18. package/dist/domains/branding.d.ts.map +1 -1
  19. package/dist/domains/branding.js +28 -5
  20. package/dist/domains/branding.js.map +1 -1
  21. package/dist/domains/clients.d.ts +23 -6
  22. package/dist/domains/clients.d.ts.map +1 -1
  23. package/dist/domains/clients.js +121 -21
  24. package/dist/domains/clients.js.map +1 -1
  25. package/dist/domains/config.d.ts +20 -3
  26. package/dist/domains/config.d.ts.map +1 -1
  27. package/dist/domains/config.js +30 -3
  28. package/dist/domains/config.js.map +1 -1
  29. package/dist/domains/custom-claims.d.ts +2 -1
  30. package/dist/domains/custom-claims.d.ts.map +1 -1
  31. package/dist/domains/custom-claims.js +2 -2
  32. package/dist/domains/custom-claims.js.map +1 -1
  33. package/dist/domains/exports.d.ts +6 -1
  34. package/dist/domains/exports.d.ts.map +1 -1
  35. package/dist/domains/exports.js +27 -1
  36. package/dist/domains/exports.js.map +1 -1
  37. package/dist/domains/helpers.d.ts +31 -0
  38. package/dist/domains/helpers.d.ts.map +1 -1
  39. package/dist/domains/helpers.js +72 -1
  40. package/dist/domains/helpers.js.map +1 -1
  41. package/dist/domains/imports.d.ts +8 -7
  42. package/dist/domains/imports.d.ts.map +1 -1
  43. package/dist/domains/imports.js +158 -14
  44. package/dist/domains/imports.js.map +1 -1
  45. package/dist/domains/index.d.ts +1 -1
  46. package/dist/domains/index.d.ts.map +1 -1
  47. package/dist/domains/organizations.d.ts +2 -9
  48. package/dist/domains/organizations.d.ts.map +1 -1
  49. package/dist/domains/organizations.js +2 -13
  50. package/dist/domains/organizations.js.map +1 -1
  51. package/dist/domains/permissions.d.ts +22 -4
  52. package/dist/domains/permissions.d.ts.map +1 -1
  53. package/dist/domains/permissions.js +47 -13
  54. package/dist/domains/permissions.js.map +1 -1
  55. package/dist/domains/roles.d.ts +26 -16
  56. package/dist/domains/roles.d.ts.map +1 -1
  57. package/dist/domains/roles.js +61 -31
  58. package/dist/domains/roles.js.map +1 -1
  59. package/dist/domains/user-roles.d.ts +9 -4
  60. package/dist/domains/user-roles.d.ts.map +1 -1
  61. package/dist/domains/user-roles.js +32 -6
  62. package/dist/domains/user-roles.js.map +1 -1
  63. package/dist/domains/users.d.ts +31 -26
  64. package/dist/domains/users.d.ts.map +1 -1
  65. package/dist/domains/users.js +56 -46
  66. package/dist/domains/users.js.map +1 -1
  67. package/dist/errors/index.d.ts +2 -0
  68. package/dist/errors/index.d.ts.map +1 -1
  69. package/dist/errors/index.js +18 -1
  70. package/dist/errors/index.js.map +1 -1
  71. package/dist/index.d.ts +1 -1
  72. package/dist/index.d.ts.map +1 -1
  73. package/dist/index.js.map +1 -1
  74. package/dist/node.d.ts +1 -1
  75. package/dist/node.d.ts.map +1 -1
  76. package/dist/pagination/index.d.ts +5 -1
  77. package/dist/pagination/index.d.ts.map +1 -1
  78. package/dist/pagination/index.js +2 -2
  79. package/dist/pagination/index.js.map +1 -1
  80. package/dist/types/applications.d.ts +27 -6
  81. package/dist/types/applications.d.ts.map +1 -1
  82. package/dist/types/branding.d.ts +38 -11
  83. package/dist/types/branding.d.ts.map +1 -1
  84. package/dist/types/branding.js +0 -5
  85. package/dist/types/branding.js.map +1 -1
  86. package/dist/types/bulk.d.ts +2 -4
  87. package/dist/types/bulk.d.ts.map +1 -1
  88. package/dist/types/clients.d.ts +98 -13
  89. package/dist/types/clients.d.ts.map +1 -1
  90. package/dist/types/common.d.ts +26 -3
  91. package/dist/types/common.d.ts.map +1 -1
  92. package/dist/types/config.d.ts +57 -21
  93. package/dist/types/config.d.ts.map +1 -1
  94. package/dist/types/config.js +1 -8
  95. package/dist/types/config.js.map +1 -1
  96. package/dist/types/exports.d.ts +17 -0
  97. package/dist/types/exports.d.ts.map +1 -1
  98. package/dist/types/imports.d.ts +388 -84
  99. package/dist/types/imports.d.ts.map +1 -1
  100. package/dist/types/imports.js +1 -7
  101. package/dist/types/imports.js.map +1 -1
  102. package/dist/types/index.d.ts +14 -14
  103. package/dist/types/index.d.ts.map +1 -1
  104. package/dist/types/organizations.d.ts +5 -9
  105. package/dist/types/organizations.d.ts.map +1 -1
  106. package/dist/types/permissions.d.ts +21 -6
  107. package/dist/types/permissions.d.ts.map +1 -1
  108. package/dist/types/roles.d.ts +3 -1
  109. package/dist/types/roles.d.ts.map +1 -1
  110. package/dist/types/user-roles.d.ts +4 -10
  111. package/dist/types/user-roles.d.ts.map +1 -1
  112. package/dist/types/users.d.ts +102 -15
  113. package/dist/types/users.d.ts.map +1 -1
  114. package/dist/version.d.ts +1 -1
  115. package/dist/version.js +1 -1
  116. package/package.json +3 -2
@@ -4,51 +4,151 @@
4
4
  * @module domains/clients
5
5
  */
6
6
  import { listAll } from '../pagination/index.js';
7
- import { unwrapData, unwrapWithEtag, etagHeaders, toQueryParams } from './helpers.js';
7
+ import { etagHeaders, isRecord, isStringArray, requireData, requireDataWithEtag, requirePaginatedData, toQueryParams, } from './helpers.js';
8
+ /** Return whether a value is one supported login-method collection. */
9
+ function isLoginMethods(value) {
10
+ return (isStringArray(value) &&
11
+ value.every((method) => method === 'password' || method === 'magic_link'));
12
+ }
13
+ /** Validate one complete client returned by the Admin API. */
14
+ function isClient(value) {
15
+ return (isRecord(value) &&
16
+ typeof value.id === 'string' &&
17
+ typeof value.organizationId === 'string' &&
18
+ typeof value.applicationId === 'string' &&
19
+ typeof value.clientId === 'string' &&
20
+ typeof value.clientName === 'string' &&
21
+ (value.clientType === 'public' || value.clientType === 'confidential') &&
22
+ (value.applicationType === 'web' ||
23
+ value.applicationType === 'native' ||
24
+ value.applicationType === 'spa') &&
25
+ isStringArray(value.redirectUris) &&
26
+ isStringArray(value.postLogoutRedirectUris) &&
27
+ isStringArray(value.grantTypes) &&
28
+ value.grantTypes.every((grant) => grant === 'authorization_code' ||
29
+ grant === 'client_credentials' ||
30
+ grant === 'refresh_token') &&
31
+ isStringArray(value.responseTypes) &&
32
+ value.responseTypes.every((responseType) => responseType === 'code') &&
33
+ typeof value.scope === 'string' &&
34
+ (value.tokenEndpointAuthMethod === 'client_secret_basic' ||
35
+ value.tokenEndpointAuthMethod === 'client_secret_post' ||
36
+ value.tokenEndpointAuthMethod === 'none') &&
37
+ isStringArray(value.allowedOrigins) &&
38
+ typeof value.requirePkce === 'boolean' &&
39
+ (value.loginMethods === null || isLoginMethods(value.loginMethods)) &&
40
+ isLoginMethods(value.effectiveLoginMethods) &&
41
+ (value.status === 'active' || value.status === 'inactive') &&
42
+ typeof value.createdAt === 'string' &&
43
+ typeof value.updatedAt === 'string');
44
+ }
45
+ /** Validate secret metadata that never contains plaintext. */
46
+ function isClientSecret(value) {
47
+ return (isRecord(value) &&
48
+ typeof value.id === 'string' &&
49
+ typeof value.clientId === 'string' &&
50
+ (typeof value.label === 'string' || value.label === null) &&
51
+ (value.status === 'active' || value.status === 'revoked') &&
52
+ (typeof value.lastUsedAt === 'string' || value.lastUsedAt === null) &&
53
+ (typeof value.expiresAt === 'string' || value.expiresAt === null) &&
54
+ typeof value.createdAt === 'string');
55
+ }
56
+ /** Validate a secret returned once by create or generate. */
57
+ function isGeneratedSecret(value) {
58
+ return (isRecord(value) &&
59
+ typeof value.id === 'string' &&
60
+ typeof value.clientId === 'string' &&
61
+ (typeof value.label === 'string' || value.label === null) &&
62
+ typeof value.plaintext === 'string' &&
63
+ (typeof value.expiresAt === 'string' || value.expiresAt === null) &&
64
+ typeof value.createdAt === 'string');
65
+ }
66
+ /** Validate one client history entry. */
67
+ function isHistoryEntry(value) {
68
+ return (isRecord(value) &&
69
+ typeof value.id === 'string' &&
70
+ typeof value.eventType === 'string' &&
71
+ (typeof value.actorId === 'string' || value.actorId === null) &&
72
+ (isRecord(value.metadata) || value.metadata === null) &&
73
+ typeof value.createdAt === 'string');
74
+ }
75
+ /** Validate the relationship between client type and its optional one-time secret. */
76
+ function isClientCreateResult(value) {
77
+ if (!isRecord(value) || !isClient(value.client))
78
+ return false;
79
+ if (value.client.clientType === 'confidential')
80
+ return isGeneratedSecret(value.secret);
81
+ return value.secret === undefined || value.secret === null;
82
+ }
83
+ /** Create the client operations backed by one HTTP transport. */
8
84
  export function createClientsDomain(transport) {
9
85
  const base = '/clients';
10
86
  return {
11
87
  async list(params) {
12
- const res = await transport.request({ method: 'GET', path: base, params: toQueryParams(params) });
13
- return res.body;
88
+ const res = await transport.request({
89
+ method: 'GET',
90
+ path: base,
91
+ params: toQueryParams(params),
92
+ });
93
+ return requirePaginatedData(res.body, isClient);
14
94
  },
15
95
  listAll(params) {
16
96
  return listAll((p) => this.list({ ...params, ...p }), params);
17
97
  },
18
- async get(idOrClientId) {
19
- const res = await transport.request({ method: 'GET', path: `${base}/${idOrClientId}` });
20
- return unwrapWithEtag(res);
98
+ async get(id) {
99
+ const res = await transport.request({ method: 'GET', path: `${base}/${id}` });
100
+ return requireDataWithEtag(res, isClient);
21
101
  },
22
102
  async create(input) {
23
103
  const res = await transport.request({ method: 'POST', path: base, body: input });
24
- return unwrapData(res.body);
104
+ const result = requireData(res.body, isClientCreateResult);
105
+ return result.secret
106
+ ? { client: result.client, secret: result.secret }
107
+ : { client: result.client };
25
108
  },
26
- async update(idOrClientId, input, etag) {
109
+ async update(id, input, etag) {
27
110
  const res = await transport.request({
28
- method: 'PUT', path: `${base}/${idOrClientId}`, body: input, headers: etagHeaders(etag),
111
+ method: 'PUT',
112
+ path: `${base}/${id}`,
113
+ body: input,
114
+ headers: etagHeaders(etag),
29
115
  });
30
- return unwrapData(res.body);
116
+ return requireData(res.body, isClient);
117
+ },
118
+ async delete(id) {
119
+ await transport.request({ method: 'DELETE', path: `${base}/${id}` });
31
120
  },
32
- async revoke(idOrClientId) {
33
- await transport.request({ method: 'POST', path: `${base}/${idOrClientId}/revoke` });
121
+ async activate(id) {
122
+ await transport.request({ method: 'POST', path: `${base}/${id}/activate` });
34
123
  },
35
- async restore(idOrClientId) {
36
- await transport.request({ method: 'POST', path: `${base}/${idOrClientId}/restore` });
124
+ async deactivate(id) {
125
+ await transport.request({ method: 'POST', path: `${base}/${id}/deactivate` });
37
126
  },
38
- async getHistory(idOrClientId, params) {
39
- const res = await transport.request({ method: 'GET', path: `${base}/${idOrClientId}/history`, params: toQueryParams(params) });
40
- return unwrapData(res.body);
127
+ async getHistory(id, params) {
128
+ const res = await transport.request({
129
+ method: 'GET',
130
+ path: `${base}/${id}/history`,
131
+ params: toQueryParams(params),
132
+ });
133
+ return requireData(res.body, (value) => Array.isArray(value) && value.every(isHistoryEntry));
41
134
  },
42
135
  async listSecrets(clientId) {
43
136
  const res = await transport.request({ method: 'GET', path: `${base}/${clientId}/secrets` });
44
- return unwrapData(res.body);
137
+ return requireData(res.body, (value) => Array.isArray(value) && value.every(isClientSecret));
45
138
  },
46
139
  async generateSecret(clientId, input) {
47
- const res = await transport.request({ method: 'POST', path: `${base}/${clientId}/secrets`, body: input });
48
- return unwrapData(res.body);
140
+ const res = await transport.request({
141
+ method: 'POST',
142
+ path: `${base}/${clientId}/secrets`,
143
+ body: input,
144
+ });
145
+ return requireData(res.body, isGeneratedSecret);
49
146
  },
50
147
  async revokeSecret(clientId, secretId) {
51
- await transport.request({ method: 'DELETE', path: `${base}/${clientId}/secrets/${secretId}` });
148
+ await transport.request({
149
+ method: 'POST',
150
+ path: `${base}/${clientId}/secrets/${secretId}/revoke`,
151
+ });
52
152
  },
53
153
  };
54
154
  }
@@ -1 +1 @@
1
- {"version":3,"file":"clients.js","sourceRoot":"","sources":["../../src/domains/clients.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"clients.js","sourceRoot":"","sources":["../../src/domains/clients.ts"],"names":[],"mappings":"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"}
@@ -4,11 +4,28 @@
4
4
  * @module domains/config
5
5
  */
6
6
  import type { HttpTransport } from '../transport/types.js';
7
- import type { ConfigEntry } from '../types/index.js';
7
+ import type { ConfigEntry, ConfigKey, ConfigValue, ConfigUpdateResult, ConfigBatchUpdateResult } from '../types/index.js';
8
+ /** Metadata-driven access to the closed operational configuration catalog. */
8
9
  export interface ConfigDomain {
9
- list(): Promise<ConfigEntry[]>;
10
+ /** Read all authoritative entries, preserving server catalog order. */
11
+ list(): Promise<readonly ConfigEntry[]>;
12
+ /** Read an untrusted name; non-catalog names receive the server's uniform 404. */
10
13
  get(key: string): Promise<ConfigEntry>;
11
- set(key: string, value: string): Promise<ConfigEntry>;
14
+ /**
15
+ * Update one native scalar and retain the required restart action.
16
+ * @throws {PortaError} If a JavaScript caller supplies a bare dot path segment
17
+ */
18
+ set(key: ConfigKey, value: ConfigValue): Promise<ConfigUpdateResult>;
19
+ /** Atomically update selected catalog keys; the server validates the entire batch. */
20
+ setMany(values: Readonly<Partial<Record<ConfigKey, ConfigValue>>>): Promise<ConfigBatchUpdateResult>;
12
21
  }
22
+ /**
23
+ * Bind configuration operations to the existing authenticated HTTP transport.
24
+ * Transport errors propagate unchanged; the server remains the validation authority.
25
+ * @param transport - Authenticated Admin API transport
26
+ * @returns Configuration operations without local policy metadata copies
27
+ * @example
28
+ * await createConfigDomain(transport).set('magic_link_ttl', 1200);
29
+ */
13
30
  export declare function createConfigDomain(transport: HttpTransport): ConfigDomain;
14
31
  //# sourceMappingURL=config.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../../src/domains/config.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,uBAAuB,CAAC;AAC3D,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAGrD,MAAM,WAAW,YAAY;IAC3B,IAAI,IAAI,OAAO,CAAC,WAAW,EAAE,CAAC,CAAC;IAC/B,GAAG,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,WAAW,CAAC,CAAC;IACvC,GAAG,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,WAAW,CAAC,CAAC;CACvD;AAED,wBAAgB,kBAAkB,CAAC,SAAS,EAAE,aAAa,GAAG,YAAY,CAezE"}
1
+ {"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../../src/domains/config.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,uBAAuB,CAAC;AAC3D,OAAO,KAAK,EACV,WAAW,EACX,SAAS,EACT,WAAW,EACX,kBAAkB,EAClB,uBAAuB,EACxB,MAAM,mBAAmB,CAAC;AAI3B,8EAA8E;AAC9E,MAAM,WAAW,YAAY;IAC3B,uEAAuE;IACvE,IAAI,IAAI,OAAO,CAAC,SAAS,WAAW,EAAE,CAAC,CAAC;IACxC,kFAAkF;IAClF,GAAG,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,WAAW,CAAC,CAAC;IACvC;;;OAGG;IACH,GAAG,CAAC,GAAG,EAAE,SAAS,EAAE,KAAK,EAAE,WAAW,GAAG,OAAO,CAAC,kBAAkB,CAAC,CAAC;IACrE,sFAAsF;IACtF,OAAO,CACL,MAAM,EAAE,QAAQ,CAAC,OAAO,CAAC,MAAM,CAAC,SAAS,EAAE,WAAW,CAAC,CAAC,CAAC,GACxD,OAAO,CAAC,uBAAuB,CAAC,CAAC;CACrC;AAED;;;;;;;GAOG;AACH,wBAAgB,kBAAkB,CAAC,SAAS,EAAE,aAAa,GAAG,YAAY,CAiCzE"}
@@ -4,6 +4,15 @@
4
4
  * @module domains/config
5
5
  */
6
6
  import { unwrapData } from './helpers.js';
7
+ import { PortaError } from '../errors/index.js';
8
+ /**
9
+ * Bind configuration operations to the existing authenticated HTTP transport.
10
+ * Transport errors propagate unchanged; the server remains the validation authority.
11
+ * @param transport - Authenticated Admin API transport
12
+ * @returns Configuration operations without local policy metadata copies
13
+ * @example
14
+ * await createConfigDomain(transport).set('magic_link_ttl', 1200);
15
+ */
7
16
  export function createConfigDomain(transport) {
8
17
  return {
9
18
  async list() {
@@ -11,12 +20,30 @@ export function createConfigDomain(transport) {
11
20
  return unwrapData(res.body);
12
21
  },
13
22
  async get(key) {
14
- const res = await transport.request({ method: 'GET', path: `/config/${key}` });
23
+ const res = await transport.request({
24
+ method: 'GET',
25
+ path: `/config/${encodeURIComponent(key)}`,
26
+ });
15
27
  return unwrapData(res.body);
16
28
  },
17
29
  async set(key, value) {
18
- const res = await transport.request({ method: 'PUT', path: `/config/${key}`, body: { value } });
19
- return unwrapData(res.body);
30
+ const encodedKey = encodeURIComponent(key);
31
+ // JavaScript and agent callers bypass compile-time keys. Bare dots survive encoding and
32
+ // are normalized by fetch, so reject them before they can leave the configuration route.
33
+ if (encodedKey === '.' || encodedKey === '..') {
34
+ throw new PortaError('Configuration key is invalid.');
35
+ }
36
+ const res = await transport.request({
37
+ method: 'PUT',
38
+ path: `/config/${encodedKey}`,
39
+ body: { value },
40
+ });
41
+ // Updates intentionally retain the envelope: unwrapping would lose the restart decision.
42
+ return res.body;
43
+ },
44
+ async setMany(values) {
45
+ const res = await transport.request({ method: 'PUT', path: '/config', body: { values } });
46
+ return res.body;
20
47
  },
21
48
  };
22
49
  }
@@ -1 +1 @@
1
- {"version":3,"file":"config.js","sourceRoot":"","sources":["../../src/domains/config.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAIH,OAAO,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AAQ1C,MAAM,UAAU,kBAAkB,CAAC,SAAwB;IACzD,OAAO;QACL,KAAK,CAAC,IAAI;YACR,MAAM,GAAG,GAAG,MAAM,SAAS,CAAC,OAAO,CAAC,EAAE,MAAM,EAAE,KAAK,EAAE,IAAI,EAAE,SAAS,EAAE,CAAC,CAAC;YACxE,OAAO,UAAU,CAAgB,GAAG,CAAC,IAAI,CAAC,CAAC;QAC7C,CAAC;QACD,KAAK,CAAC,GAAG,CAAC,GAAG;YACX,MAAM,GAAG,GAAG,MAAM,SAAS,CAAC,OAAO,CAAC,EAAE,MAAM,EAAE,KAAK,EAAE,IAAI,EAAE,WAAW,GAAG,EAAE,EAAE,CAAC,CAAC;YAC/E,OAAO,UAAU,CAAc,GAAG,CAAC,IAAI,CAAC,CAAC;QAC3C,CAAC;QACD,KAAK,CAAC,GAAG,CAAC,GAAG,EAAE,KAAK;YAClB,MAAM,GAAG,GAAG,MAAM,SAAS,CAAC,OAAO,CAAC,EAAE,MAAM,EAAE,KAAK,EAAE,IAAI,EAAE,WAAW,GAAG,EAAE,EAAE,IAAI,EAAE,EAAE,KAAK,EAAE,EAAE,CAAC,CAAC;YAChG,OAAO,UAAU,CAAc,GAAG,CAAC,IAAI,CAAC,CAAC;QAC3C,CAAC;KACF,CAAC;AACJ,CAAC"}
1
+ {"version":3,"file":"config.js","sourceRoot":"","sources":["../../src/domains/config.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAUH,OAAO,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AAC1C,OAAO,EAAE,UAAU,EAAE,MAAM,oBAAoB,CAAC;AAmBhD;;;;;;;GAOG;AACH,MAAM,UAAU,kBAAkB,CAAC,SAAwB;IACzD,OAAO;QACL,KAAK,CAAC,IAAI;YACR,MAAM,GAAG,GAAG,MAAM,SAAS,CAAC,OAAO,CAAC,EAAE,MAAM,EAAE,KAAK,EAAE,IAAI,EAAE,SAAS,EAAE,CAAC,CAAC;YACxE,OAAO,UAAU,CAAyB,GAAG,CAAC,IAAI,CAAC,CAAC;QACtD,CAAC;QACD,KAAK,CAAC,GAAG,CAAC,GAAG;YACX,MAAM,GAAG,GAAG,MAAM,SAAS,CAAC,OAAO,CAAC;gBAClC,MAAM,EAAE,KAAK;gBACb,IAAI,EAAE,WAAW,kBAAkB,CAAC,GAAG,CAAC,EAAE;aAC3C,CAAC,CAAC;YACH,OAAO,UAAU,CAAc,GAAG,CAAC,IAAI,CAAC,CAAC;QAC3C,CAAC;QACD,KAAK,CAAC,GAAG,CAAC,GAAG,EAAE,KAAK;YAClB,MAAM,UAAU,GAAG,kBAAkB,CAAC,GAAG,CAAC,CAAC;YAC3C,wFAAwF;YACxF,yFAAyF;YACzF,IAAI,UAAU,KAAK,GAAG,IAAI,UAAU,KAAK,IAAI,EAAE,CAAC;gBAC9C,MAAM,IAAI,UAAU,CAAC,+BAA+B,CAAC,CAAC;YACxD,CAAC;YACD,MAAM,GAAG,GAAG,MAAM,SAAS,CAAC,OAAO,CAAC;gBAClC,MAAM,EAAE,KAAK;gBACb,IAAI,EAAE,WAAW,UAAU,EAAE;gBAC7B,IAAI,EAAE,EAAE,KAAK,EAAE;aAChB,CAAC,CAAC;YACH,yFAAyF;YACzF,OAAO,GAAG,CAAC,IAA0B,CAAC;QACxC,CAAC;QACD,KAAK,CAAC,OAAO,CAAC,MAAM;YAClB,MAAM,GAAG,GAAG,MAAM,SAAS,CAAC,OAAO,CAAC,EAAE,MAAM,EAAE,KAAK,EAAE,IAAI,EAAE,SAAS,EAAE,IAAI,EAAE,EAAE,MAAM,EAAE,EAAE,CAAC,CAAC;YAC1F,OAAO,GAAG,CAAC,IAA+B,CAAC;QAC7C,CAAC;KACF,CAAC;AACJ,CAAC"}
@@ -11,7 +11,8 @@ export interface CustomClaimsDomain {
11
11
  get(appId: string, claimId: string): Promise<ClaimDefinition>;
12
12
  create(appId: string, input: CreateClaimDefinitionInput): Promise<ClaimDefinition>;
13
13
  update(appId: string, claimId: string, input: UpdateClaimDefinitionInput): Promise<ClaimDefinition>;
14
- archive(appId: string, claimId: string): Promise<void>;
14
+ /** Permanently delete a claim definition through its parent-qualified route. */
15
+ delete(appId: string, claimId: string): Promise<void>;
15
16
  }
16
17
  export declare function createCustomClaimsDomain(transport: HttpTransport): CustomClaimsDomain;
17
18
  //# sourceMappingURL=custom-claims.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"custom-claims.d.ts","sourceRoot":"","sources":["../../src/domains/custom-claims.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,uBAAuB,CAAC;AAC3D,OAAO,KAAK,EAAE,eAAe,EAAE,0BAA0B,EAAE,0BAA0B,EAAE,UAAU,EAAE,iBAAiB,EAAE,MAAM,mBAAmB,CAAC;AAIhJ,MAAM,WAAW,kBAAkB;IACjC,IAAI,CAAC,KAAK,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,UAAU,GAAG,OAAO,CAAC,iBAAiB,CAAC,eAAe,CAAC,CAAC,CAAC;IACtF,OAAO,CAAC,KAAK,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,IAAI,CAAC,UAAU,EAAE,MAAM,GAAG,QAAQ,CAAC,GAAG,OAAO,CAAC,eAAe,EAAE,CAAC,CAAC;IACjG,GAAG,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,eAAe,CAAC,CAAC;IAC9D,MAAM,CAAC,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,0BAA0B,GAAG,OAAO,CAAC,eAAe,CAAC,CAAC;IACnF,MAAM,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,0BAA0B,GAAG,OAAO,CAAC,eAAe,CAAC,CAAC;IACpG,OAAO,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;CACxD;AAED,wBAAgB,wBAAwB,CAAC,SAAS,EAAE,aAAa,GAAG,kBAAkB,CA2BrF"}
1
+ {"version":3,"file":"custom-claims.d.ts","sourceRoot":"","sources":["../../src/domains/custom-claims.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,uBAAuB,CAAC;AAC3D,OAAO,KAAK,EAAE,eAAe,EAAE,0BAA0B,EAAE,0BAA0B,EAAE,UAAU,EAAE,iBAAiB,EAAE,MAAM,mBAAmB,CAAC;AAIhJ,MAAM,WAAW,kBAAkB;IACjC,IAAI,CAAC,KAAK,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,UAAU,GAAG,OAAO,CAAC,iBAAiB,CAAC,eAAe,CAAC,CAAC,CAAC;IACtF,OAAO,CAAC,KAAK,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,IAAI,CAAC,UAAU,EAAE,MAAM,GAAG,QAAQ,CAAC,GAAG,OAAO,CAAC,eAAe,EAAE,CAAC,CAAC;IACjG,GAAG,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,eAAe,CAAC,CAAC;IAC9D,MAAM,CAAC,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,0BAA0B,GAAG,OAAO,CAAC,eAAe,CAAC,CAAC;IACnF,MAAM,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,0BAA0B,GAAG,OAAO,CAAC,eAAe,CAAC,CAAC;IACpG,gFAAgF;IAChF,MAAM,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;CACvD;AAED,wBAAgB,wBAAwB,CAAC,SAAS,EAAE,aAAa,GAAG,kBAAkB,CA2BrF"}
@@ -27,8 +27,8 @@ export function createCustomClaimsDomain(transport) {
27
27
  const res = await transport.request({ method: 'PUT', path: `${base(appId)}/${claimId}`, body: input });
28
28
  return unwrapData(res.body);
29
29
  },
30
- async archive(appId, claimId) {
31
- await transport.request({ method: 'POST', path: `${base(appId)}/${claimId}/archive` });
30
+ async delete(appId, claimId) {
31
+ await transport.request({ method: 'DELETE', path: `${base(appId)}/${claimId}` });
32
32
  },
33
33
  };
34
34
  }
@@ -1 +1 @@
1
- {"version":3,"file":"custom-claims.js","sourceRoot":"","sources":["../../src/domains/custom-claims.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAIH,OAAO,EAAE,OAAO,EAAE,MAAM,wBAAwB,CAAC;AACjD,OAAO,EAAE,UAAU,EAAE,aAAa,EAAE,MAAM,cAAc,CAAC;AAWzD,MAAM,UAAU,wBAAwB,CAAC,SAAwB;IAC/D,SAAS,IAAI,CAAC,KAAa,IAAI,OAAO,iBAAiB,KAAK,SAAS,CAAC,CAAC,CAAC;IAExE,OAAO;QACL,KAAK,CAAC,IAAI,CAAC,KAAK,EAAE,MAAO;YACvB,MAAM,GAAG,GAAG,MAAM,SAAS,CAAC,OAAO,CAAC,EAAE,MAAM,EAAE,KAAK,EAAE,IAAI,EAAE,IAAI,CAAC,KAAK,CAAC,EAAE,MAAM,EAAE,aAAa,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;YACzG,OAAO,GAAG,CAAC,IAA0C,CAAC;QACxD,CAAC;QACD,OAAO,CAAC,KAAK,EAAE,MAAO;YACpB,OAAO,OAAO,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,EAAE,EAAE,GAAG,MAAM,EAAE,GAAG,CAAC,EAAE,CAAC,EAAE,MAAM,CAAC,CAAC;QACvE,CAAC;QACD,KAAK,CAAC,GAAG,CAAC,KAAK,EAAE,OAAO;YACtB,MAAM,GAAG,GAAG,MAAM,SAAS,CAAC,OAAO,CAAC,EAAE,MAAM,EAAE,KAAK,EAAE,IAAI,EAAE,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,OAAO,EAAE,EAAE,CAAC,CAAC;YAC1F,OAAO,UAAU,CAAkB,GAAG,CAAC,IAAI,CAAC,CAAC;QAC/C,CAAC;QACD,KAAK,CAAC,MAAM,CAAC,KAAK,EAAE,KAAK;YACvB,MAAM,GAAG,GAAG,MAAM,SAAS,CAAC,OAAO,CAAC,EAAE,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,IAAI,CAAC,KAAK,CAAC,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC,CAAC;YACxF,OAAO,UAAU,CAAkB,GAAG,CAAC,IAAI,CAAC,CAAC;QAC/C,CAAC;QACD,KAAK,CAAC,MAAM,CAAC,KAAK,EAAE,OAAO,EAAE,KAAK;YAChC,MAAM,GAAG,GAAG,MAAM,SAAS,CAAC,OAAO,CAAC,EAAE,MAAM,EAAE,KAAK,EAAE,IAAI,EAAE,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,OAAO,EAAE,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC,CAAC;YACvG,OAAO,UAAU,CAAkB,GAAG,CAAC,IAAI,CAAC,CAAC;QAC/C,CAAC;QACD,KAAK,CAAC,OAAO,CAAC,KAAK,EAAE,OAAO;YAC1B,MAAM,SAAS,CAAC,OAAO,CAAC,EAAE,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,OAAO,UAAU,EAAE,CAAC,CAAC;QACzF,CAAC;KACF,CAAC;AACJ,CAAC"}
1
+ {"version":3,"file":"custom-claims.js","sourceRoot":"","sources":["../../src/domains/custom-claims.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAIH,OAAO,EAAE,OAAO,EAAE,MAAM,wBAAwB,CAAC;AACjD,OAAO,EAAE,UAAU,EAAE,aAAa,EAAE,MAAM,cAAc,CAAC;AAYzD,MAAM,UAAU,wBAAwB,CAAC,SAAwB;IAC/D,SAAS,IAAI,CAAC,KAAa,IAAI,OAAO,iBAAiB,KAAK,SAAS,CAAC,CAAC,CAAC;IAExE,OAAO;QACL,KAAK,CAAC,IAAI,CAAC,KAAK,EAAE,MAAO;YACvB,MAAM,GAAG,GAAG,MAAM,SAAS,CAAC,OAAO,CAAC,EAAE,MAAM,EAAE,KAAK,EAAE,IAAI,EAAE,IAAI,CAAC,KAAK,CAAC,EAAE,MAAM,EAAE,aAAa,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;YACzG,OAAO,GAAG,CAAC,IAA0C,CAAC;QACxD,CAAC;QACD,OAAO,CAAC,KAAK,EAAE,MAAO;YACpB,OAAO,OAAO,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,EAAE,EAAE,GAAG,MAAM,EAAE,GAAG,CAAC,EAAE,CAAC,EAAE,MAAM,CAAC,CAAC;QACvE,CAAC;QACD,KAAK,CAAC,GAAG,CAAC,KAAK,EAAE,OAAO;YACtB,MAAM,GAAG,GAAG,MAAM,SAAS,CAAC,OAAO,CAAC,EAAE,MAAM,EAAE,KAAK,EAAE,IAAI,EAAE,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,OAAO,EAAE,EAAE,CAAC,CAAC;YAC1F,OAAO,UAAU,CAAkB,GAAG,CAAC,IAAI,CAAC,CAAC;QAC/C,CAAC;QACD,KAAK,CAAC,MAAM,CAAC,KAAK,EAAE,KAAK;YACvB,MAAM,GAAG,GAAG,MAAM,SAAS,CAAC,OAAO,CAAC,EAAE,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,IAAI,CAAC,KAAK,CAAC,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC,CAAC;YACxF,OAAO,UAAU,CAAkB,GAAG,CAAC,IAAI,CAAC,CAAC;QAC/C,CAAC;QACD,KAAK,CAAC,MAAM,CAAC,KAAK,EAAE,OAAO,EAAE,KAAK;YAChC,MAAM,GAAG,GAAG,MAAM,SAAS,CAAC,OAAO,CAAC,EAAE,MAAM,EAAE,KAAK,EAAE,IAAI,EAAE,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,OAAO,EAAE,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC,CAAC;YACvG,OAAO,UAAU,CAAkB,GAAG,CAAC,IAAI,CAAC,CAAC;QAC/C,CAAC;QACD,KAAK,CAAC,MAAM,CAAC,KAAK,EAAE,OAAO;YACzB,MAAM,SAAS,CAAC,OAAO,CAAC,EAAE,MAAM,EAAE,QAAQ,EAAE,IAAI,EAAE,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,OAAO,EAAE,EAAE,CAAC,CAAC;QACnF,CAAC;KACF,CAAC;AACJ,CAAC"}
@@ -4,9 +4,14 @@
4
4
  * @module domains/exports
5
5
  */
6
6
  import type { HttpTransport, TransportResponse } from '../transport/types.js';
7
- import type { ExportParams } from '../types/index.js';
7
+ import type { ExportManifestRequest, ExportManifestResponse, ExportParams } from '../types/index.js';
8
+ /** Administrative report downloads and selective manifest exports. */
8
9
  export interface ExportsDomain {
10
+ /** Download one existing CSV or JSON administrative report. */
9
11
  download(params: ExportParams): Promise<TransportResponse>;
12
+ /** Export one parsed portability manifest without writing a local file. */
13
+ manifest(request: ExportManifestRequest): Promise<ExportManifestResponse>;
10
14
  }
15
+ /** Create the export operations backed by one shared HTTP transport. */
11
16
  export declare function createExportsDomain(transport: HttpTransport): ExportsDomain;
12
17
  //# sourceMappingURL=exports.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"exports.d.ts","sourceRoot":"","sources":["../../src/domains/exports.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,KAAK,EAAE,aAAa,EAAE,iBAAiB,EAAE,MAAM,uBAAuB,CAAC;AAC9E,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AAGtD,MAAM,WAAW,aAAa;IAC5B,QAAQ,CAAC,MAAM,EAAE,YAAY,GAAG,OAAO,CAAC,iBAAiB,CAAC,CAAC;CAC5D;AAED,wBAAgB,mBAAmB,CAAC,SAAS,EAAE,aAAa,GAAG,aAAa,CAY3E"}
1
+ {"version":3,"file":"exports.d.ts","sourceRoot":"","sources":["../../src/domains/exports.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,KAAK,EAAE,aAAa,EAAE,iBAAiB,EAAE,MAAM,uBAAuB,CAAC;AAC9E,OAAO,KAAK,EACV,qBAAqB,EACrB,sBAAsB,EACtB,YAAY,EAEb,MAAM,mBAAmB,CAAC;AAmB3B,sEAAsE;AACtE,MAAM,WAAW,aAAa;IAC5B,+DAA+D;IAC/D,QAAQ,CAAC,MAAM,EAAE,YAAY,GAAG,OAAO,CAAC,iBAAiB,CAAC,CAAC;IAC3D,2EAA2E;IAC3E,QAAQ,CAAC,OAAO,EAAE,qBAAqB,GAAG,OAAO,CAAC,sBAAsB,CAAC,CAAC;CAC3E;AAED,wEAAwE;AACxE,wBAAgB,mBAAmB,CAAC,SAAS,EAAE,aAAa,GAAG,aAAa,CAwB3E"}
@@ -3,7 +3,22 @@
3
3
  *
4
4
  * @module domains/exports
5
5
  */
6
- import { toQueryParams } from './helpers.js';
6
+ import { toQueryParams, unwrapData } from './helpers.js';
7
+ /** Path-free attachment names accepted from the server response. */
8
+ const SAFE_ATTACHMENT_FILENAME = /^[A-Za-z0-9][A-Za-z0-9._-]{0,254}$/;
9
+ /** Return the server attachment name only when it is a safe final path component. */
10
+ function attachmentFilename(contentDisposition) {
11
+ if (!contentDisposition)
12
+ return undefined;
13
+ const match = /filename\s*=\s*(?:"([^"]+)"|([^;\s]+))/i.exec(contentDisposition);
14
+ const filename = match?.[1] ?? match?.[2];
15
+ return filename && SAFE_ATTACHMENT_FILENAME.test(filename) ? filename : undefined;
16
+ }
17
+ /** Create a path-free fallback name from the current UTC instant. */
18
+ function fallbackManifestFilename() {
19
+ return `porta-manifest-${new Date().toISOString().replace(/[:.]/g, '-')}.json`;
20
+ }
21
+ /** Create the export operations backed by one shared HTTP transport. */
7
22
  export function createExportsDomain(transport) {
8
23
  return {
9
24
  async download(params) {
@@ -15,6 +30,17 @@ export function createExportsDomain(transport) {
15
30
  responseType: 'raw',
16
31
  });
17
32
  },
33
+ async manifest(request) {
34
+ const response = await transport.request({
35
+ method: 'POST',
36
+ path: '/export/manifest',
37
+ body: request,
38
+ });
39
+ return {
40
+ manifest: unwrapData(response.body),
41
+ filename: attachmentFilename(response.headers['content-disposition']) ?? fallbackManifestFilename(),
42
+ };
43
+ },
18
44
  };
19
45
  }
20
46
  //# sourceMappingURL=exports.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"exports.js","sourceRoot":"","sources":["../../src/domains/exports.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAIH,OAAO,EAAE,aAAa,EAAE,MAAM,cAAc,CAAC;AAM7C,MAAM,UAAU,mBAAmB,CAAC,SAAwB;IAC1D,OAAO;QACL,KAAK,CAAC,QAAQ,CAAC,MAAM;YACnB,MAAM,EAAE,UAAU,EAAE,GAAG,IAAI,EAAE,GAAG,MAAM,CAAC;YACvC,OAAO,SAAS,CAAC,OAAO,CAAC;gBACvB,MAAM,EAAE,KAAK;gBACb,IAAI,EAAE,WAAW,UAAU,EAAE;gBAC7B,MAAM,EAAE,aAAa,CAAC,IAAI,CAAC;gBAC3B,YAAY,EAAE,KAAK;aACpB,CAAC,CAAC;QACL,CAAC;KACF,CAAC;AACJ,CAAC"}
1
+ {"version":3,"file":"exports.js","sourceRoot":"","sources":["../../src/domains/exports.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AASH,OAAO,EAAE,aAAa,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AAEzD,oEAAoE;AACpE,MAAM,wBAAwB,GAAG,oCAAoC,CAAC;AAEtE,qFAAqF;AACrF,SAAS,kBAAkB,CAAC,kBAAsC;IAChE,IAAI,CAAC,kBAAkB;QAAE,OAAO,SAAS,CAAC;IAC1C,MAAM,KAAK,GAAG,yCAAyC,CAAC,IAAI,CAAC,kBAAkB,CAAC,CAAC;IACjF,MAAM,QAAQ,GAAG,KAAK,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,EAAE,CAAC,CAAC,CAAC,CAAC;IAC1C,OAAO,QAAQ,IAAI,wBAAwB,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,SAAS,CAAC;AACpF,CAAC;AAED,qEAAqE;AACrE,SAAS,wBAAwB;IAC/B,OAAO,kBAAkB,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC,OAAO,CAAC,OAAO,EAAE,GAAG,CAAC,OAAO,CAAC;AACjF,CAAC;AAUD,wEAAwE;AACxE,MAAM,UAAU,mBAAmB,CAAC,SAAwB;IAC1D,OAAO;QACL,KAAK,CAAC,QAAQ,CAAC,MAAM;YACnB,MAAM,EAAE,UAAU,EAAE,GAAG,IAAI,EAAE,GAAG,MAAM,CAAC;YACvC,OAAO,SAAS,CAAC,OAAO,CAAC;gBACvB,MAAM,EAAE,KAAK;gBACb,IAAI,EAAE,WAAW,UAAU,EAAE;gBAC7B,MAAM,EAAE,aAAa,CAAC,IAAI,CAAC;gBAC3B,YAAY,EAAE,KAAK;aACpB,CAAC,CAAC;QACL,CAAC;QACD,KAAK,CAAC,QAAQ,CAAC,OAAO;YACpB,MAAM,QAAQ,GAAG,MAAM,SAAS,CAAC,OAAO,CAAC;gBACvC,MAAM,EAAE,MAAM;gBACd,IAAI,EAAE,kBAAkB;gBACxB,IAAI,EAAE,OAAO;aACd,CAAC,CAAC;YACH,OAAO;gBACL,QAAQ,EAAE,UAAU,CAAsB,QAAQ,CAAC,IAAI,CAAC;gBACxD,QAAQ,EACN,kBAAkB,CAAC,QAAQ,CAAC,OAAO,CAAC,qBAAqB,CAAC,CAAC,IAAI,wBAAwB,EAAE;aAC5F,CAAC;QACJ,CAAC;KACF,CAAC;AACJ,CAAC"}
@@ -4,6 +4,37 @@
4
4
  * @module domains/helpers
5
5
  */
6
6
  import type { TransportResponse } from '../transport/types.js';
7
+ import type { ETagResponse, PaginatedResponse } from '../types/index.js';
8
+ /** Return whether a value is a non-null object record. */
9
+ export declare function isRecord(value: unknown): value is Record<string, unknown>;
10
+ /** Return whether every array entry is a string. */
11
+ export declare function isStringArray(value: unknown): value is string[];
12
+ /**
13
+ * Require a `{ data: T }` response envelope and validate its payload.
14
+ *
15
+ * @param body - Raw response body
16
+ * @param isData - Feature-specific payload guard
17
+ * @returns Validated payload
18
+ * @throws {PortaError} When the envelope or payload is invalid
19
+ */
20
+ export declare function requireData<T>(body: unknown, isData: (value: unknown) => value is T): T;
21
+ /**
22
+ * Require a paginated response whose every item passes the supplied guard.
23
+ *
24
+ * @param body - Raw response body
25
+ * @param isItem - Feature-specific item guard
26
+ * @returns Validated pagination response
27
+ * @throws {PortaError} When pagination metadata or an item is invalid
28
+ */
29
+ export declare function requirePaginatedData<T>(body: unknown, isItem: (value: unknown) => value is T): PaginatedResponse<T>;
30
+ /**
31
+ * Require a validated data envelope while preserving its ETag header.
32
+ *
33
+ * @param response - Raw transport response
34
+ * @param isData - Feature-specific payload guard
35
+ * @returns Validated payload and optional ETag
36
+ */
37
+ export declare function requireDataWithEtag<T>(response: TransportResponse, isData: (value: unknown) => value is T): ETagResponse<T>;
7
38
  /**
8
39
  * Unwrap a `{ data: T }` response envelope.
9
40
  * If the body already has a `data` property, extracts it; otherwise returns as-is.
@@ -1 +1 @@
1
- {"version":3,"file":"helpers.d.ts","sourceRoot":"","sources":["../../src/domains/helpers.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,uBAAuB,CAAC;AAE/D;;;GAGG;AACH,wBAAgB,UAAU,CAAC,CAAC,EAAE,IAAI,EAAE,OAAO,GAAG,CAAC,CAK9C;AAED;;GAEG;AACH,wBAAgB,cAAc,CAAC,CAAC,EAAE,QAAQ,EAAE,iBAAiB,GAAG;IAAE,IAAI,EAAE,CAAC,CAAC;IAAC,IAAI,EAAE,MAAM,GAAG,IAAI,CAAA;CAAE,CAI/F;AAED;;GAEG;AACH,wBAAgB,WAAW,CAAC,IAAI,CAAC,EAAE,MAAM,GAAG,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAGjE;AAED;;GAEG;AACH,wBAAgB,aAAa,CAC3B,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAC/B,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,GAAG,OAAO,CAAC,GAAG,SAAS,CASvD"}
1
+ {"version":3,"file":"helpers.d.ts","sourceRoot":"","sources":["../../src/domains/helpers.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,uBAAuB,CAAC;AAC/D,OAAO,KAAK,EAAE,YAAY,EAAE,iBAAiB,EAAE,MAAM,mBAAmB,CAAC;AAGzE,0DAA0D;AAC1D,wBAAgB,QAAQ,CAAC,KAAK,EAAE,OAAO,GAAG,KAAK,IAAI,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAEzE;AAED,oDAAoD;AACpD,wBAAgB,aAAa,CAAC,KAAK,EAAE,OAAO,GAAG,KAAK,IAAI,MAAM,EAAE,CAE/D;AAOD;;;;;;;GAOG;AACH,wBAAgB,WAAW,CAAC,CAAC,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,EAAE,CAAC,KAAK,EAAE,OAAO,KAAK,KAAK,IAAI,CAAC,GAAG,CAAC,CAKvF;AAED;;;;;;;GAOG;AACH,wBAAgB,oBAAoB,CAAC,CAAC,EACpC,IAAI,EAAE,OAAO,EACb,MAAM,EAAE,CAAC,KAAK,EAAE,OAAO,KAAK,KAAK,IAAI,CAAC,GACrC,iBAAiB,CAAC,CAAC,CAAC,CAwBtB;AAED;;;;;;GAMG;AACH,wBAAgB,mBAAmB,CAAC,CAAC,EACnC,QAAQ,EAAE,iBAAiB,EAC3B,MAAM,EAAE,CAAC,KAAK,EAAE,OAAO,KAAK,KAAK,IAAI,CAAC,GACrC,YAAY,CAAC,CAAC,CAAC,CAIjB;AAED;;;GAGG;AACH,wBAAgB,UAAU,CAAC,CAAC,EAAE,IAAI,EAAE,OAAO,GAAG,CAAC,CAK9C;AAED;;GAEG;AACH,wBAAgB,cAAc,CAAC,CAAC,EAAE,QAAQ,EAAE,iBAAiB,GAAG;IAAE,IAAI,EAAE,CAAC,CAAC;IAAC,IAAI,EAAE,MAAM,GAAG,IAAI,CAAA;CAAE,CAI/F;AAED;;GAEG;AACH,wBAAgB,WAAW,CAAC,IAAI,CAAC,EAAE,MAAM,GAAG,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAGjE;AAED;;GAEG;AACH,wBAAgB,aAAa,CAC3B,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAC/B,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,GAAG,OAAO,CAAC,GAAG,SAAS,CAavD"}
@@ -3,6 +3,75 @@
3
3
  *
4
4
  * @module domains/helpers
5
5
  */
6
+ import { PortaError } from '../errors/index.js';
7
+ /** Return whether a value is a non-null object record. */
8
+ export function isRecord(value) {
9
+ return typeof value === 'object' && value !== null && !Array.isArray(value);
10
+ }
11
+ /** Return whether every array entry is a string. */
12
+ export function isStringArray(value) {
13
+ return Array.isArray(value) && value.every((entry) => typeof entry === 'string');
14
+ }
15
+ /** Create the fixed SDK error used when a successful response has an invalid public shape. */
16
+ function invalidResponseError() {
17
+ return new PortaError('Porta API returned an invalid response.');
18
+ }
19
+ /**
20
+ * Require a `{ data: T }` response envelope and validate its payload.
21
+ *
22
+ * @param body - Raw response body
23
+ * @param isData - Feature-specific payload guard
24
+ * @returns Validated payload
25
+ * @throws {PortaError} When the envelope or payload is invalid
26
+ */
27
+ export function requireData(body, isData) {
28
+ if (!isRecord(body) || !('data' in body) || !isData(body.data)) {
29
+ throw invalidResponseError();
30
+ }
31
+ return body.data;
32
+ }
33
+ /**
34
+ * Require a paginated response whose every item passes the supplied guard.
35
+ *
36
+ * @param body - Raw response body
37
+ * @param isItem - Feature-specific item guard
38
+ * @returns Validated pagination response
39
+ * @throws {PortaError} When pagination metadata or an item is invalid
40
+ */
41
+ export function requirePaginatedData(body, isItem) {
42
+ if (!isRecord(body) ||
43
+ !Array.isArray(body.data) ||
44
+ !body.data.every(isItem) ||
45
+ typeof body.total !== 'number' ||
46
+ (body.page !== undefined && typeof body.page !== 'number') ||
47
+ (body.pageSize !== undefined && typeof body.pageSize !== 'number') ||
48
+ (body.totalPages !== undefined && typeof body.totalPages !== 'number') ||
49
+ (body.cursor !== undefined && body.cursor !== null && typeof body.cursor !== 'string') ||
50
+ (body.hasMore !== undefined && typeof body.hasMore !== 'boolean')) {
51
+ throw invalidResponseError();
52
+ }
53
+ return {
54
+ data: body.data,
55
+ total: body.total,
56
+ ...(body.page !== undefined ? { page: body.page } : {}),
57
+ ...(body.pageSize !== undefined ? { pageSize: body.pageSize } : {}),
58
+ ...(body.totalPages !== undefined ? { totalPages: body.totalPages } : {}),
59
+ ...(typeof body.cursor === 'string' ? { cursor: body.cursor } : {}),
60
+ ...(body.hasMore !== undefined ? { hasMore: body.hasMore } : {}),
61
+ };
62
+ }
63
+ /**
64
+ * Require a validated data envelope while preserving its ETag header.
65
+ *
66
+ * @param response - Raw transport response
67
+ * @param isData - Feature-specific payload guard
68
+ * @returns Validated payload and optional ETag
69
+ */
70
+ export function requireDataWithEtag(response, isData) {
71
+ const data = requireData(response.body, isData);
72
+ const etag = response.headers?.['etag'] ?? response.headers?.['ETag'] ?? null;
73
+ return { data, etag };
74
+ }
6
75
  /**
7
76
  * Unwrap a `{ data: T }` response envelope.
8
77
  * If the body already has a `data` property, extracts it; otherwise returns as-is.
@@ -37,7 +106,9 @@ export function toQueryParams(params) {
37
106
  return undefined;
38
107
  const result = {};
39
108
  for (const [key, value] of Object.entries(params)) {
40
- if (value !== undefined && value !== null && (typeof value === 'string' || typeof value === 'number' || typeof value === 'boolean')) {
109
+ if (value !== undefined &&
110
+ value !== null &&
111
+ (typeof value === 'string' || typeof value === 'number' || typeof value === 'boolean')) {
41
112
  result[key] = value;
42
113
  }
43
114
  }
@@ -1 +1 @@
1
- {"version":3,"file":"helpers.js","sourceRoot":"","sources":["../../src/domains/helpers.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAIH;;;GAGG;AACH,MAAM,UAAU,UAAU,CAAI,IAAa;IACzC,IAAI,IAAI,IAAI,OAAO,IAAI,KAAK,QAAQ,IAAI,MAAM,IAAI,IAAI,EAAE,CAAC;QACvD,OAAQ,IAAoB,CAAC,IAAI,CAAC;IACpC,CAAC;IACD,OAAO,IAAS,CAAC;AACnB,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,cAAc,CAAI,QAA2B;IAC3D,MAAM,IAAI,GAAG,UAAU,CAAI,QAAQ,CAAC,IAAI,CAAC,CAAC;IAC1C,MAAM,IAAI,GAAG,QAAQ,CAAC,OAAO,EAAE,CAAC,MAAM,CAAC,IAAI,QAAQ,CAAC,OAAO,EAAE,CAAC,MAAM,CAAC,IAAI,IAAI,CAAC;IAC9E,OAAO,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC;AACxB,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,WAAW,CAAC,IAAa;IACvC,IAAI,CAAC,IAAI;QAAE,OAAO,EAAE,CAAC;IACrB,OAAO,EAAE,UAAU,EAAE,IAAI,EAAE,CAAC;AAC9B,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,aAAa,CAC3B,MAAgC;IAEhC,IAAI,CAAC,MAAM;QAAE,OAAO,SAAS,CAAC;IAC9B,MAAM,MAAM,GAA8C,EAAE,CAAC;IAC7D,KAAK,MAAM,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE,CAAC;QAClD,IAAI,KAAK,KAAK,SAAS,IAAI,KAAK,KAAK,IAAI,IAAI,CAAC,OAAO,KAAK,KAAK,QAAQ,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,OAAO,KAAK,KAAK,SAAS,CAAC,EAAE,CAAC;YACpI,MAAM,CAAC,GAAG,CAAC,GAAG,KAAK,CAAC;QACtB,CAAC;IACH,CAAC;IACD,OAAO,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,SAAS,CAAC;AAC7D,CAAC"}
1
+ {"version":3,"file":"helpers.js","sourceRoot":"","sources":["../../src/domains/helpers.ts"],"names":[],"mappings":"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"}
@@ -1,12 +1,13 @@
1
- /**
2
- * Imports domain — declarative provisioning / data import.
3
- *
4
- * @module domains/imports
5
- */
1
+ /** Strict portability-manifest preview and import operations. */
6
2
  import type { HttpTransport } from '../transport/types.js';
7
- import type { ImportManifest, ImportResult } from '../types/index.js';
3
+ import type { PortabilityManifest, PortabilityResult } from '../types/index.js';
4
+ /** Strict manifest preview and apply operations. */
8
5
  export interface ImportsDomain {
9
- provision(manifest: ImportManifest): Promise<ImportResult>;
6
+ /** Build a mutation-free import plan. */
7
+ preview(manifest: PortabilityManifest): Promise<PortabilityResult>;
8
+ /** Apply one validated manifest using the selected existing-record policy. */
9
+ apply(manifest: PortabilityManifest, mode: 'keep-existing' | 'update-existing'): Promise<PortabilityResult>;
10
10
  }
11
+ /** Create the import operations backed by one shared HTTP transport. */
11
12
  export declare function createImportsDomain(transport: HttpTransport): ImportsDomain;
12
13
  //# sourceMappingURL=imports.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"imports.d.ts","sourceRoot":"","sources":["../../src/domains/imports.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,uBAAuB,CAAC;AAC3D,OAAO,KAAK,EAAE,cAAc,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AAEtE,MAAM,WAAW,aAAa;IAC5B,SAAS,CAAC,QAAQ,EAAE,cAAc,GAAG,OAAO,CAAC,YAAY,CAAC,CAAC;CAC5D;AAED,wBAAgB,mBAAmB,CAAC,SAAS,EAAE,aAAa,GAAG,aAAa,CAa3E"}
1
+ {"version":3,"file":"imports.d.ts","sourceRoot":"","sources":["../../src/domains/imports.ts"],"names":[],"mappings":"AAAA,iEAAiE;AAEjE,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,uBAAuB,CAAC;AAC3D,OAAO,KAAK,EAIV,mBAAmB,EAEnB,iBAAiB,EAClB,MAAM,mBAAmB,CAAC;AA4L3B,oDAAoD;AACpD,MAAM,WAAW,aAAa;IAC5B,yCAAyC;IACzC,OAAO,CAAC,QAAQ,EAAE,mBAAmB,GAAG,OAAO,CAAC,iBAAiB,CAAC,CAAC;IACnE,8EAA8E;IAC9E,KAAK,CACH,QAAQ,EAAE,mBAAmB,EAC7B,IAAI,EAAE,eAAe,GAAG,iBAAiB,GACxC,OAAO,CAAC,iBAAiB,CAAC,CAAC;CAC/B;AAED,wEAAwE;AACxE,wBAAgB,mBAAmB,CAAC,SAAS,EAAE,aAAa,GAAG,aAAa,CAS3E"}