devflare 1.0.0-next.18 → 1.0.0-next.19
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/account-d43d1eqs.js +475 -0
- package/dist/cli/index.js +1 -1
- package/dist/cloudflare/index.js +2 -2
- package/dist/cloudflare/tokens.d.ts.map +1 -1
- package/dist/index-7r7dfpcm.js +133 -0
- package/dist/index-k7m5f1dg.js +200 -0
- package/dist/index-vt803j3b.js +1372 -0
- package/dist/index.js +1 -1
- package/dist/login-7yex6ppq.js +77 -0
- package/dist/previews-6fepv94a.js +1225 -0
- package/dist/productions-2t9q8f57.js +505 -0
- package/dist/token-a2b38w0z.js +419 -0
- package/dist/worker-99tew196.js +513 -0
- package/dist/worker-entry/composed-worker.d.ts.map +1 -1
- package/package.json +1 -1
|
@@ -0,0 +1,200 @@
|
|
|
1
|
+
import {
|
|
2
|
+
apiDelete,
|
|
3
|
+
apiGetAll,
|
|
4
|
+
apiPost,
|
|
5
|
+
apiPut
|
|
6
|
+
} from "./index-mg8vwqxf.js";
|
|
7
|
+
|
|
8
|
+
// src/cloudflare/known-permission-group-ids.generated.ts
|
|
9
|
+
var KNOWN_PERMISSION_GROUP_IDS_DATA = {
|
|
10
|
+
WORKERS_SCRIPTS_WRITE: null,
|
|
11
|
+
WORKERS_SCRIPTS_READ: null,
|
|
12
|
+
ACCOUNT_SETTINGS_READ: null,
|
|
13
|
+
WORKERS_KV_STORAGE_WRITE: null,
|
|
14
|
+
WORKERS_KV_STORAGE_READ: null,
|
|
15
|
+
ACCOUNT_API_TOKENS_WRITE: null,
|
|
16
|
+
ACCOUNT_API_TOKENS_READ: null
|
|
17
|
+
};
|
|
18
|
+
|
|
19
|
+
// src/cloudflare/tokens.ts
|
|
20
|
+
var MAX_ACCOUNT_OWNED_TOKEN_PERMISSION_GROUPS = 300;
|
|
21
|
+
var DEVFLARE_MANAGED_TOKEN_PREFIX = "devflare-";
|
|
22
|
+
var ACCOUNT_OWNED_TOKEN_SCOPE = "com.cloudflare.api.account";
|
|
23
|
+
var ACCOUNT_API_TOKENS_PERMISSION_GROUP_NAME_PATTERN = /^Account API Tokens\b/i;
|
|
24
|
+
var DEVFLARE_MANAGED_TOKEN_NAME_PATTERN = /^devflare-/i;
|
|
25
|
+
var DEVFLARE_PERMISSION_GROUP_NAME_PATTERNS = [
|
|
26
|
+
/^Account Analytics /i,
|
|
27
|
+
/^Account Settings /i,
|
|
28
|
+
/^Account Filter Lists /i,
|
|
29
|
+
/^AI /i,
|
|
30
|
+
/^Analytics /i,
|
|
31
|
+
/^Browser Rendering /i,
|
|
32
|
+
/^Cache Purge\b/i,
|
|
33
|
+
/^D1 /i,
|
|
34
|
+
/^DNS /i,
|
|
35
|
+
/^Email /i,
|
|
36
|
+
/^Hyperdrive /i,
|
|
37
|
+
/^Images /i,
|
|
38
|
+
/^Logs /i,
|
|
39
|
+
/^Logpush /i,
|
|
40
|
+
/^Pages /i,
|
|
41
|
+
/^Queues /i,
|
|
42
|
+
/^R2 /i,
|
|
43
|
+
/^SSL and Certificates /i,
|
|
44
|
+
/^Stream /i,
|
|
45
|
+
/^Vectorize /i,
|
|
46
|
+
/^Workers /i,
|
|
47
|
+
/^Zone Settings /i,
|
|
48
|
+
/^Zone /i
|
|
49
|
+
];
|
|
50
|
+
function deriveKnownPermissionGroupIds(data) {
|
|
51
|
+
const result = {};
|
|
52
|
+
for (const key of Object.keys(data)) {
|
|
53
|
+
const value = data[key];
|
|
54
|
+
result[key] = value === null ? undefined : value;
|
|
55
|
+
}
|
|
56
|
+
return result;
|
|
57
|
+
}
|
|
58
|
+
var KNOWN_PERMISSION_GROUP_IDS = deriveKnownPermissionGroupIds(KNOWN_PERMISSION_GROUP_IDS_DATA);
|
|
59
|
+
function dedupePermissionGroups(permissionGroups) {
|
|
60
|
+
const seenIds = new Set;
|
|
61
|
+
return permissionGroups.filter((permissionGroup) => {
|
|
62
|
+
if (seenIds.has(permissionGroup.id)) {
|
|
63
|
+
return false;
|
|
64
|
+
}
|
|
65
|
+
seenIds.add(permissionGroup.id);
|
|
66
|
+
return true;
|
|
67
|
+
});
|
|
68
|
+
}
|
|
69
|
+
function dedupePermissionGroupIds(permissionGroupIds) {
|
|
70
|
+
return Array.from(new Set(permissionGroupIds.map((id) => id.trim()).filter(Boolean)));
|
|
71
|
+
}
|
|
72
|
+
function excludeAccountApiTokensPermissionGroups(permissionGroups) {
|
|
73
|
+
return permissionGroups.filter((permissionGroup) => {
|
|
74
|
+
return !ACCOUNT_API_TOKENS_PERMISSION_GROUP_NAME_PATTERN.test(permissionGroup.name);
|
|
75
|
+
});
|
|
76
|
+
}
|
|
77
|
+
function keepAccountOwnedTokenCompatiblePermissionGroups(permissionGroups) {
|
|
78
|
+
return permissionGroups.filter((permissionGroup) => {
|
|
79
|
+
return permissionGroup.scopes.some((scope) => scope.trim() === ACCOUNT_OWNED_TOKEN_SCOPE);
|
|
80
|
+
});
|
|
81
|
+
}
|
|
82
|
+
function selectReusableAccountOwnedTokenPermissionGroups(permissionGroups) {
|
|
83
|
+
return dedupePermissionGroups(excludeAccountApiTokensPermissionGroups(keepAccountOwnedTokenCompatiblePermissionGroups(permissionGroups)));
|
|
84
|
+
}
|
|
85
|
+
function parseOptionalDate(value) {
|
|
86
|
+
if (!value) {
|
|
87
|
+
return;
|
|
88
|
+
}
|
|
89
|
+
const parsed = new Date(value);
|
|
90
|
+
return Number.isNaN(parsed.getTime()) ? undefined : parsed;
|
|
91
|
+
}
|
|
92
|
+
function mapAccountOwnedAPITokenPolicy(policy) {
|
|
93
|
+
return {
|
|
94
|
+
id: policy.id,
|
|
95
|
+
effect: policy.effect,
|
|
96
|
+
permissionGroups: policy.permission_groups?.map((permissionGroup) => ({
|
|
97
|
+
id: permissionGroup.id,
|
|
98
|
+
name: permissionGroup.name
|
|
99
|
+
}))
|
|
100
|
+
};
|
|
101
|
+
}
|
|
102
|
+
function mapAccountOwnedAPIToken(token) {
|
|
103
|
+
return {
|
|
104
|
+
id: token.id,
|
|
105
|
+
name: token.name ?? token.id,
|
|
106
|
+
status: token.status,
|
|
107
|
+
value: token.value,
|
|
108
|
+
issuedOn: parseOptionalDate(token.issued_on),
|
|
109
|
+
modifiedOn: parseOptionalDate(token.modified_on),
|
|
110
|
+
lastUsedOn: parseOptionalDate(token.last_used_on),
|
|
111
|
+
policies: token.policies?.map(mapAccountOwnedAPITokenPolicy)
|
|
112
|
+
};
|
|
113
|
+
}
|
|
114
|
+
function isDevflareManagedTokenName(name) {
|
|
115
|
+
return DEVFLARE_MANAGED_TOKEN_NAME_PATTERN.test(name.trim());
|
|
116
|
+
}
|
|
117
|
+
function normalizeDevflareTokenName(name) {
|
|
118
|
+
const trimmedName = name.trim();
|
|
119
|
+
if (!trimmedName) {
|
|
120
|
+
throw new Error("Devflare token name cannot be empty");
|
|
121
|
+
}
|
|
122
|
+
const suffix = isDevflareManagedTokenName(trimmedName) ? trimmedName.replace(DEVFLARE_MANAGED_TOKEN_NAME_PATTERN, "") : trimmedName;
|
|
123
|
+
if (!suffix) {
|
|
124
|
+
throw new Error("Devflare token name cannot be empty");
|
|
125
|
+
}
|
|
126
|
+
return `${DEVFLARE_MANAGED_TOKEN_PREFIX}${suffix}`;
|
|
127
|
+
}
|
|
128
|
+
function stripDevflareTokenNamePrefix(name) {
|
|
129
|
+
const trimmedName = name.trim();
|
|
130
|
+
if (!trimmedName) {
|
|
131
|
+
return trimmedName;
|
|
132
|
+
}
|
|
133
|
+
const strippedName = trimmedName.replace(DEVFLARE_MANAGED_TOKEN_NAME_PATTERN, "");
|
|
134
|
+
return strippedName || trimmedName;
|
|
135
|
+
}
|
|
136
|
+
function filterDevflareManagedTokens(tokens) {
|
|
137
|
+
return tokens.filter((token) => isDevflareManagedTokenName(token.name));
|
|
138
|
+
}
|
|
139
|
+
function selectDevflarePermissionGroups(permissionGroups) {
|
|
140
|
+
const selectedPermissionGroups = dedupePermissionGroups(selectReusableAccountOwnedTokenPermissionGroups(permissionGroups).filter((permissionGroup) => {
|
|
141
|
+
return DEVFLARE_PERMISSION_GROUP_NAME_PATTERNS.some((pattern) => {
|
|
142
|
+
return pattern.test(permissionGroup.name);
|
|
143
|
+
});
|
|
144
|
+
}));
|
|
145
|
+
if (selectedPermissionGroups.length === 0) {
|
|
146
|
+
throw new Error("Could not map the available Cloudflare permission groups to a Devflare token policy.");
|
|
147
|
+
}
|
|
148
|
+
if (selectedPermissionGroups.length > MAX_ACCOUNT_OWNED_TOKEN_PERMISSION_GROUPS) {
|
|
149
|
+
throw new Error(`Devflare selected ${selectedPermissionGroups.length} permission groups, which exceeds Cloudflare's ${MAX_ACCOUNT_OWNED_TOKEN_PERMISSION_GROUPS}-group limit for account-owned tokens.`);
|
|
150
|
+
}
|
|
151
|
+
return selectedPermissionGroups;
|
|
152
|
+
}
|
|
153
|
+
function selectAllReusablePermissionGroups(permissionGroups) {
|
|
154
|
+
const selectedPermissionGroups = selectReusableAccountOwnedTokenPermissionGroups(permissionGroups);
|
|
155
|
+
if (selectedPermissionGroups.length === 0) {
|
|
156
|
+
throw new Error("Could not find any reusable account-scoped Cloudflare permission groups for this Devflare token.");
|
|
157
|
+
}
|
|
158
|
+
if (selectedPermissionGroups.length > MAX_ACCOUNT_OWNED_TOKEN_PERMISSION_GROUPS) {
|
|
159
|
+
throw new Error(`Devflare selected ${selectedPermissionGroups.length} permission groups, which exceeds Cloudflare's ${MAX_ACCOUNT_OWNED_TOKEN_PERMISSION_GROUPS}-group limit for account-owned tokens.`);
|
|
160
|
+
}
|
|
161
|
+
return selectedPermissionGroups;
|
|
162
|
+
}
|
|
163
|
+
async function listAccountTokenPermissionGroups(accountId, options) {
|
|
164
|
+
const permissionGroups = await apiGetAll(`/accounts/${accountId}/tokens/permission_groups`, options);
|
|
165
|
+
return dedupePermissionGroups(permissionGroups);
|
|
166
|
+
}
|
|
167
|
+
async function listAccountOwnedAPITokens(accountId, options) {
|
|
168
|
+
const tokens = await apiGetAll(`/accounts/${accountId}/tokens`, options);
|
|
169
|
+
return tokens.map(mapAccountOwnedAPIToken);
|
|
170
|
+
}
|
|
171
|
+
async function deleteAccountOwnedAPIToken(accountId, tokenId, options) {
|
|
172
|
+
return apiDelete(`/accounts/${accountId}/tokens/${tokenId}`, options);
|
|
173
|
+
}
|
|
174
|
+
async function rollAccountOwnedAPITokenValue(accountId, tokenId, options) {
|
|
175
|
+
return apiPut(`/accounts/${accountId}/tokens/${tokenId}/value`, {}, options);
|
|
176
|
+
}
|
|
177
|
+
async function createAccountOwnedAPIToken(accountId, options, clientOptions) {
|
|
178
|
+
const permissionGroupIds = dedupePermissionGroupIds(options.permissionGroupIds);
|
|
179
|
+
if (permissionGroupIds.length === 0) {
|
|
180
|
+
throw new Error("Cannot create a Devflare token without any permission groups");
|
|
181
|
+
}
|
|
182
|
+
if (permissionGroupIds.length > MAX_ACCOUNT_OWNED_TOKEN_PERMISSION_GROUPS) {
|
|
183
|
+
throw new Error(`Cannot create a Devflare token with more than ${MAX_ACCOUNT_OWNED_TOKEN_PERMISSION_GROUPS} permission groups.`);
|
|
184
|
+
}
|
|
185
|
+
const createdToken = await apiPost(`/accounts/${accountId}/tokens`, {
|
|
186
|
+
name: options.name,
|
|
187
|
+
policies: [
|
|
188
|
+
{
|
|
189
|
+
effect: "allow",
|
|
190
|
+
resources: {
|
|
191
|
+
[`com.cloudflare.api.account.${accountId}`]: "*"
|
|
192
|
+
},
|
|
193
|
+
permission_groups: permissionGroupIds.map((id) => ({ id }))
|
|
194
|
+
}
|
|
195
|
+
]
|
|
196
|
+
}, clientOptions);
|
|
197
|
+
return mapAccountOwnedAPIToken(createdToken);
|
|
198
|
+
}
|
|
199
|
+
|
|
200
|
+
export { normalizeDevflareTokenName, stripDevflareTokenNamePrefix, filterDevflareManagedTokens, selectDevflarePermissionGroups, selectAllReusablePermissionGroups, listAccountTokenPermissionGroups, listAccountOwnedAPITokens, deleteAccountOwnedAPIToken, rollAccountOwnedAPITokenValue, createAccountOwnedAPIToken };
|