@fluxfiles/node 0.1.15 → 0.1.17

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/index.d.mts CHANGED
@@ -96,6 +96,10 @@ interface BaseTokenOptions {
96
96
  /** Allow editing a file's text content (GET/PUT /api/fm/content). Default **false** — editing
97
97
  * config/executable files (wp-config.php, .env, nginx.conf, deploy.sh) is powerful, so it's opt-in. */
98
98
  allowCodeEdit?: boolean;
99
+ /** Allow the SSH terminal (POST /api/fm/terminal) on an SFTP disk. Default **false** — grants shell
100
+ * access as the SSH user, so it's opt-in. Core-standalone: the token must target a real core
101
+ * (this SDK does), not a proxy adapter that doesn't serve /api/fm/terminal. */
102
+ allowTerminal?: boolean;
99
103
  /** Allow the paid Optimization module (POST /api/fm/optimize). Default **false** — opt-in.
100
104
  * Even when true, the optimize module must be installed + licensed on the server. */
101
105
  allowOptimize?: boolean;
@@ -124,6 +128,17 @@ interface BaseTokenOptions {
124
128
  * identical re-upload is kept as a copy (like Finder / Drive / Dropbox); set true
125
129
  * to save storage by blocking duplicates. */
126
130
  dedupeUploads?: boolean;
131
+ /** Edition preset that defaults a tier's claims (`pro`/`agency`/`enterprise`).
132
+ * DX sugar — explicit claim options still win, and the license gates the code. */
133
+ edition?: 'free' | 'pro' | 'agency' | 'enterprise';
134
+ /** Paid-module claims (3-layer gate: code installed + licensed + this claim).
135
+ * All default off; inert unless the module is installed & licensed on the server. */
136
+ allowShare?: boolean;
137
+ allowAiVision?: boolean;
138
+ allowOcr?: boolean;
139
+ allowVirusScan?: boolean;
140
+ allowBackup?: boolean;
141
+ allowC2pa?: boolean;
127
142
  /** Allow downloading a multi-file/-folder selection as a zip (POST /api/fm/zip). Default true. */
128
143
  allowZip?: boolean;
129
144
  /** Allow extracting a zip in place (POST /api/fm/extract). Default true. */
package/dist/index.d.ts CHANGED
@@ -96,6 +96,10 @@ interface BaseTokenOptions {
96
96
  /** Allow editing a file's text content (GET/PUT /api/fm/content). Default **false** — editing
97
97
  * config/executable files (wp-config.php, .env, nginx.conf, deploy.sh) is powerful, so it's opt-in. */
98
98
  allowCodeEdit?: boolean;
99
+ /** Allow the SSH terminal (POST /api/fm/terminal) on an SFTP disk. Default **false** — grants shell
100
+ * access as the SSH user, so it's opt-in. Core-standalone: the token must target a real core
101
+ * (this SDK does), not a proxy adapter that doesn't serve /api/fm/terminal. */
102
+ allowTerminal?: boolean;
99
103
  /** Allow the paid Optimization module (POST /api/fm/optimize). Default **false** — opt-in.
100
104
  * Even when true, the optimize module must be installed + licensed on the server. */
101
105
  allowOptimize?: boolean;
@@ -124,6 +128,17 @@ interface BaseTokenOptions {
124
128
  * identical re-upload is kept as a copy (like Finder / Drive / Dropbox); set true
125
129
  * to save storage by blocking duplicates. */
126
130
  dedupeUploads?: boolean;
131
+ /** Edition preset that defaults a tier's claims (`pro`/`agency`/`enterprise`).
132
+ * DX sugar — explicit claim options still win, and the license gates the code. */
133
+ edition?: 'free' | 'pro' | 'agency' | 'enterprise';
134
+ /** Paid-module claims (3-layer gate: code installed + licensed + this claim).
135
+ * All default off; inert unless the module is installed & licensed on the server. */
136
+ allowShare?: boolean;
137
+ allowAiVision?: boolean;
138
+ allowOcr?: boolean;
139
+ allowVirusScan?: boolean;
140
+ allowBackup?: boolean;
141
+ allowC2pa?: boolean;
127
142
  /** Allow downloading a multi-file/-folder selection as a zip (POST /api/fm/zip). Default true. */
128
143
  allowZip?: boolean;
129
144
  /** Allow extracting a zip in place (POST /api/fm/extract). Default true. */
package/dist/index.js CHANGED
@@ -136,7 +136,16 @@ function sanitizeVariants(v) {
136
136
  }
137
137
  return Object.keys(out).length ? out : null;
138
138
  }
139
+ var EDITION_PRESETS = {
140
+ pro: { allow_optimize: true, allow_share: true },
141
+ agency: { allow_optimize: true, allow_share: true },
142
+ enterprise: { allow_optimize: true, allow_share: true, allow_virus_scan: true }
143
+ };
139
144
  function applyTenantOverrides(payload, opts) {
145
+ const preset = opts.edition ? EDITION_PRESETS[String(opts.edition).toLowerCase()] : void 0;
146
+ if (preset) {
147
+ for (const [k, v] of Object.entries(preset)) if (!(k in payload)) payload[k] = v;
148
+ }
140
149
  if (opts.aiAutoTag !== void 0) payload.ai_auto_tag = !!opts.aiAutoTag;
141
150
  if (opts.rateRead && opts.rateRead > 0) payload.rate_read = Math.trunc(opts.rateRead);
142
151
  if (opts.rateWrite && opts.rateWrite > 0) payload.rate_write = Math.trunc(opts.rateWrite);
@@ -162,7 +171,14 @@ function applyTenantOverrides(payload, opts) {
162
171
  if (opts.allowDownload !== void 0) payload.allow_download = !!opts.allowDownload;
163
172
  if (opts.allowChmod !== void 0) payload.allow_chmod = !!opts.allowChmod;
164
173
  if (opts.allowCodeEdit !== void 0) payload.allow_code_edit = !!opts.allowCodeEdit;
174
+ if (opts.allowTerminal !== void 0) payload.allow_terminal = !!opts.allowTerminal;
165
175
  if (opts.allowOptimize !== void 0) payload.allow_optimize = !!opts.allowOptimize;
176
+ if (opts.allowShare !== void 0) payload.allow_share = !!opts.allowShare;
177
+ if (opts.allowAiVision !== void 0) payload.allow_ai_vision = !!opts.allowAiVision;
178
+ if (opts.allowOcr !== void 0) payload.allow_ocr = !!opts.allowOcr;
179
+ if (opts.allowVirusScan !== void 0) payload.allow_virus_scan = !!opts.allowVirusScan;
180
+ if (opts.allowBackup !== void 0) payload.allow_backup = !!opts.allowBackup;
181
+ if (opts.allowC2pa !== void 0) payload.allow_c2pa = !!opts.allowC2pa;
166
182
  if (opts.autoOptimize !== void 0) payload.auto_optimize = !!opts.autoOptimize;
167
183
  if (opts.optimizeQuality && opts.optimizeQuality > 0) payload.optimize_quality = Math.trunc(opts.optimizeQuality);
168
184
  if (opts.optimizeFormat === "avif") payload.optimize_format = "avif";
package/dist/index.mjs CHANGED
@@ -114,7 +114,16 @@ function sanitizeVariants(v) {
114
114
  }
115
115
  return Object.keys(out).length ? out : null;
116
116
  }
117
+ var EDITION_PRESETS = {
118
+ pro: { allow_optimize: true, allow_share: true },
119
+ agency: { allow_optimize: true, allow_share: true },
120
+ enterprise: { allow_optimize: true, allow_share: true, allow_virus_scan: true }
121
+ };
117
122
  function applyTenantOverrides(payload, opts) {
123
+ const preset = opts.edition ? EDITION_PRESETS[String(opts.edition).toLowerCase()] : void 0;
124
+ if (preset) {
125
+ for (const [k, v] of Object.entries(preset)) if (!(k in payload)) payload[k] = v;
126
+ }
118
127
  if (opts.aiAutoTag !== void 0) payload.ai_auto_tag = !!opts.aiAutoTag;
119
128
  if (opts.rateRead && opts.rateRead > 0) payload.rate_read = Math.trunc(opts.rateRead);
120
129
  if (opts.rateWrite && opts.rateWrite > 0) payload.rate_write = Math.trunc(opts.rateWrite);
@@ -140,7 +149,14 @@ function applyTenantOverrides(payload, opts) {
140
149
  if (opts.allowDownload !== void 0) payload.allow_download = !!opts.allowDownload;
141
150
  if (opts.allowChmod !== void 0) payload.allow_chmod = !!opts.allowChmod;
142
151
  if (opts.allowCodeEdit !== void 0) payload.allow_code_edit = !!opts.allowCodeEdit;
152
+ if (opts.allowTerminal !== void 0) payload.allow_terminal = !!opts.allowTerminal;
143
153
  if (opts.allowOptimize !== void 0) payload.allow_optimize = !!opts.allowOptimize;
154
+ if (opts.allowShare !== void 0) payload.allow_share = !!opts.allowShare;
155
+ if (opts.allowAiVision !== void 0) payload.allow_ai_vision = !!opts.allowAiVision;
156
+ if (opts.allowOcr !== void 0) payload.allow_ocr = !!opts.allowOcr;
157
+ if (opts.allowVirusScan !== void 0) payload.allow_virus_scan = !!opts.allowVirusScan;
158
+ if (opts.allowBackup !== void 0) payload.allow_backup = !!opts.allowBackup;
159
+ if (opts.allowC2pa !== void 0) payload.allow_c2pa = !!opts.allowC2pa;
144
160
  if (opts.autoOptimize !== void 0) payload.auto_optimize = !!opts.autoOptimize;
145
161
  if (opts.optimizeQuality && opts.optimizeQuality > 0) payload.optimize_quality = Math.trunc(opts.optimizeQuality);
146
162
  if (opts.optimizeFormat === "avif") payload.optimize_format = "avif";
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@fluxfiles/node",
3
- "version": "0.1.15",
3
+ "version": "0.1.17",
4
4
  "description": "Server-side Node/TypeScript SDK for minting FluxFiles JWTs (plain + BYOB), byte-compatible with the PHP core",
5
5
  "license": "MIT",
6
6
  "sideEffects": false,
package/src/token.ts CHANGED
@@ -97,8 +97,17 @@ function sanitizeVariants(v: BaseTokenOptions['variants']): Record<string, numbe
97
97
  return Object.keys(out).length ? out : null;
98
98
  }
99
99
 
100
+ /** Edition preset (DX sugar): default a tier's claims; explicit opts below win. */
101
+ const EDITION_PRESETS: Record<string, Record<string, boolean>> = {
102
+ pro: { allow_optimize: true, allow_share: true },
103
+ agency: { allow_optimize: true, allow_share: true },
104
+ enterprise: { allow_optimize: true, allow_share: true, allow_virus_scan: true },
105
+ };
106
+
100
107
  /** Copy the optional per-tenant override claims into a payload when set. */
101
108
  function applyTenantOverrides(payload: Record<string, unknown>, opts: BaseTokenOptions): void {
109
+ const preset = opts.edition ? EDITION_PRESETS[String(opts.edition).toLowerCase()] : undefined;
110
+ if (preset) for (const [k, v] of Object.entries(preset)) if (!(k in payload)) payload[k] = v;
102
111
  if (opts.aiAutoTag !== undefined) payload.ai_auto_tag = !!opts.aiAutoTag;
103
112
  if (opts.rateRead && opts.rateRead > 0) payload.rate_read = Math.trunc(opts.rateRead);
104
113
  if (opts.rateWrite && opts.rateWrite > 0) payload.rate_write = Math.trunc(opts.rateWrite);
@@ -132,7 +141,17 @@ function applyTenantOverrides(payload: Record<string, unknown>, opts: BaseTokenO
132
141
  if (opts.allowDownload !== undefined) payload.allow_download = !!opts.allowDownload;
133
142
  if (opts.allowChmod !== undefined) payload.allow_chmod = !!opts.allowChmod;
134
143
  if (opts.allowCodeEdit !== undefined) payload.allow_code_edit = !!opts.allowCodeEdit;
144
+ // SSH terminal (SFTP disks). Core-standalone — the token must target a real core
145
+ // (Node mints for one), not a proxy adapter that doesn't serve /api/fm/terminal.
146
+ if (opts.allowTerminal !== undefined) payload.allow_terminal = !!opts.allowTerminal;
135
147
  if (opts.allowOptimize !== undefined) payload.allow_optimize = !!opts.allowOptimize;
148
+ // Other paid-module claims (inert unless the module is installed + licensed).
149
+ if (opts.allowShare !== undefined) payload.allow_share = !!opts.allowShare;
150
+ if (opts.allowAiVision !== undefined) payload.allow_ai_vision = !!opts.allowAiVision;
151
+ if (opts.allowOcr !== undefined) payload.allow_ocr = !!opts.allowOcr;
152
+ if (opts.allowVirusScan !== undefined) payload.allow_virus_scan = !!opts.allowVirusScan;
153
+ if (opts.allowBackup !== undefined) payload.allow_backup = !!opts.allowBackup;
154
+ if (opts.allowC2pa !== undefined) payload.allow_c2pa = !!opts.allowC2pa;
136
155
  if (opts.autoOptimize !== undefined) payload.auto_optimize = !!opts.autoOptimize;
137
156
  if (opts.optimizeQuality && opts.optimizeQuality > 0) payload.optimize_quality = Math.trunc(opts.optimizeQuality);
138
157
  if (opts.optimizeFormat === 'avif') payload.optimize_format = 'avif';
package/src/types.ts CHANGED
@@ -100,6 +100,10 @@ export interface BaseTokenOptions {
100
100
  /** Allow editing a file's text content (GET/PUT /api/fm/content). Default **false** — editing
101
101
  * config/executable files (wp-config.php, .env, nginx.conf, deploy.sh) is powerful, so it's opt-in. */
102
102
  allowCodeEdit?: boolean;
103
+ /** Allow the SSH terminal (POST /api/fm/terminal) on an SFTP disk. Default **false** — grants shell
104
+ * access as the SSH user, so it's opt-in. Core-standalone: the token must target a real core
105
+ * (this SDK does), not a proxy adapter that doesn't serve /api/fm/terminal. */
106
+ allowTerminal?: boolean;
103
107
  /** Allow the paid Optimization module (POST /api/fm/optimize). Default **false** — opt-in.
104
108
  * Even when true, the optimize module must be installed + licensed on the server. */
105
109
  allowOptimize?: boolean;
@@ -128,6 +132,17 @@ export interface BaseTokenOptions {
128
132
  * identical re-upload is kept as a copy (like Finder / Drive / Dropbox); set true
129
133
  * to save storage by blocking duplicates. */
130
134
  dedupeUploads?: boolean;
135
+ /** Edition preset that defaults a tier's claims (`pro`/`agency`/`enterprise`).
136
+ * DX sugar — explicit claim options still win, and the license gates the code. */
137
+ edition?: 'free' | 'pro' | 'agency' | 'enterprise';
138
+ /** Paid-module claims (3-layer gate: code installed + licensed + this claim).
139
+ * All default off; inert unless the module is installed & licensed on the server. */
140
+ allowShare?: boolean;
141
+ allowAiVision?: boolean;
142
+ allowOcr?: boolean;
143
+ allowVirusScan?: boolean;
144
+ allowBackup?: boolean;
145
+ allowC2pa?: boolean;
131
146
  /** Allow downloading a multi-file/-folder selection as a zip (POST /api/fm/zip). Default true. */
132
147
  allowZip?: boolean;
133
148
  /** Allow extracting a zip in place (POST /api/fm/extract). Default true. */