@drawbridge/drawbridge-utils 0.0.2 → 0.0.3

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/README.md CHANGED
@@ -1,18 +1,39 @@
1
1
  # @drawbridge/drawbridge-utils
2
2
 
3
- Shared helper functions used across the drawbridge-* repositories.
3
+ Shared helpers and data used across the drawbridge-* repositories.
4
4
 
5
- ## Exports
5
+ ## Main entry
6
6
 
7
+ ```js
8
+ const utils = require( '@drawbridge/drawbridge-utils' );
9
+ // or: import { capitalize } from '@drawbridge/drawbridge-utils';
10
+ ```
11
+
12
+ Exports:
13
+
14
+ - `bytesToGB( bytes )` / `bytesToMB( bytes )` — byte conversion.
7
15
  - `capitalize( string )` — uppercases the first character.
8
- - `formatCurrency({ code, digits, display, locale, value })` Intl-based currency formatter. `display: 'standard'` (default) returns Intl's standard string; `'parts'` splits symbol/number for custom layouts.
9
- - `formatDateString({ date, locale, options })` — Intl-based date formatter.
16
+ - `constants` default record shape per Mongo collection name (action, brand, campaign, draw, member, organization, page, prize, range, referrer, template, usage, user).
17
+ - `currencies` / `currency( code )` — list of ISO currencies (key/value/code/digits) and lookup by code.
18
+ - `expiredPaymentMethod( card )` — checks if a card record's year/month is in the past.
19
+ - `formatCurrency({ code, digits, display, locale, value })` — Intl-based formatter. `display: 'standard'` (default) returns Intl's standard string; `'parts'` splits symbol/number for custom layouts.
20
+ - `formatDateString({ date, locale, time, options })` — Intl-based date formatter. `time: true` adds hour/minute.
10
21
  - `formatNumber( number, digits )` — Intl-based number formatter with fixed-digit min/max.
11
- - `getPlanFeature( plan, key )` — looks up a feature on a plan; returns `{ granted, message }`.
12
- - `regex` `{ url, protocols }` shared URL regex constants.
13
- - `shareUrls({ formUri, organization, page })` — builds page share URLs from the configured form base URI.
14
- - `urlRoot( string )` — `'https://'` if the input string contains `'https'`, else `'http://'`.
15
- - `infinite`, `isInfinite( value )`, `megabyte`, `gigabyte` — size-related constants.
22
+ - `getPlanFeature( plan, key )` — `{ granted, message }` lookup.
23
+ - `infinite`, `isInfinite( value )`, `megabyte`, `gigabyte` size constants.
24
+ - `percentage( a, b, decimals )` — `(a / b) * 100`, fixed decimals.
25
+ - `reducers.fields` — reducer for grouping fields by `additional` / `lead` type.
26
+ - `regex.url` / `regex.protocols` / `regex.domain` — shared regex constants.
27
+ - `shareUrls({ formUri, organization, page })` — builds share URLs from the configured form base URI. Falls back to `process.env.APP_CLIENT_FORM_URI` if `formUri` is not passed (server-only).
28
+ - `urlRoot( string )` — `'https://'` if input contains `'https'`, else `'http://'`.
29
+
30
+ ## Encrypt entry (server-only)
31
+
32
+ ```js
33
+ const { encrypt, decrypt } = require( '@drawbridge/drawbridge-utils/encrypt' );
34
+ ```
35
+
36
+ Server-only because it uses Node `crypto` and reads `process.env.ENCRYPTION_KEY`. Exposed as a sub-export so client bundles don't pull Node built-ins.
16
37
 
17
38
  ## Build & publish
18
39
 
@@ -22,4 +43,4 @@ npm install
22
43
  npm run build
23
44
  ```
24
45
 
25
- `build` runs `tsup` (dual CJS + ESM output) and then `npm publish`. Bump the `version` in `package.json` first.
46
+ `build` runs `tsup` (multi-entry, dual CJS + ESM output) and then `npm publish`. Bump `version` in `package.json` first.
@@ -0,0 +1,15 @@
1
+ var __getOwnPropNames = Object.getOwnPropertyNames;
2
+ var __require = /* @__PURE__ */ ((x) => typeof require !== "undefined" ? require : typeof Proxy !== "undefined" ? new Proxy(x, {
3
+ get: (a, b) => (typeof require !== "undefined" ? require : a)[b]
4
+ }) : x)(function(x) {
5
+ if (typeof require !== "undefined") return require.apply(this, arguments);
6
+ throw Error('Dynamic require of "' + x + '" is not supported');
7
+ });
8
+ var __commonJS = (cb, mod) => function __require2() {
9
+ return mod || (0, cb[__getOwnPropNames(cb)[0]])((mod = { exports: {} }).exports, mod), mod.exports;
10
+ };
11
+
12
+ export {
13
+ __require,
14
+ __commonJS
15
+ };
@@ -0,0 +1,46 @@
1
+ const crypto = require( 'crypto' );
2
+
3
+ const ALGORITHM = 'aes-256-gcm';
4
+
5
+ const getKey = () => Buffer.from( process.env.ENCRYPTION_KEY, 'hex' );
6
+
7
+ const encrypt = ( value ) => {
8
+
9
+ const iv = crypto.randomBytes( 12 );
10
+ const cipher = crypto.createCipheriv( ALGORITHM, getKey(), iv );
11
+ const data = Buffer.concat([
12
+ cipher.update( JSON.stringify( value ), 'utf8' ),
13
+ cipher.final()
14
+ ]);
15
+ const tag = cipher.getAuthTag();
16
+
17
+ return [ iv, tag, data ].map( ( b ) => b.toString( 'hex' ) ).join( ':' );
18
+
19
+ };
20
+
21
+ const decrypt = ( value ) => {
22
+
23
+ if( typeof value !== 'string' ) return value;
24
+
25
+ const [ ivHex, tagHex, dataHex ] = value.split( ':' );
26
+ const decipher = crypto.createDecipheriv(
27
+ ALGORITHM,
28
+ getKey(),
29
+ Buffer.from( ivHex, 'hex' )
30
+ );
31
+
32
+ decipher.setAuthTag( Buffer.from( tagHex, 'hex' ) );
33
+
34
+ const result = Buffer.concat([
35
+ decipher.update( Buffer.from( dataHex, 'hex' ) ),
36
+ decipher.final()
37
+ ]);
38
+
39
+ return JSON.parse( result.toString( 'utf8' ) );
40
+
41
+ };
42
+
43
+ module.exports = {
44
+ decrypt,
45
+ encrypt
46
+ };
@@ -0,0 +1,46 @@
1
+ const crypto = require( 'crypto' );
2
+
3
+ const ALGORITHM = 'aes-256-gcm';
4
+
5
+ const getKey = () => Buffer.from( process.env.ENCRYPTION_KEY, 'hex' );
6
+
7
+ const encrypt = ( value ) => {
8
+
9
+ const iv = crypto.randomBytes( 12 );
10
+ const cipher = crypto.createCipheriv( ALGORITHM, getKey(), iv );
11
+ const data = Buffer.concat([
12
+ cipher.update( JSON.stringify( value ), 'utf8' ),
13
+ cipher.final()
14
+ ]);
15
+ const tag = cipher.getAuthTag();
16
+
17
+ return [ iv, tag, data ].map( ( b ) => b.toString( 'hex' ) ).join( ':' );
18
+
19
+ };
20
+
21
+ const decrypt = ( value ) => {
22
+
23
+ if( typeof value !== 'string' ) return value;
24
+
25
+ const [ ivHex, tagHex, dataHex ] = value.split( ':' );
26
+ const decipher = crypto.createDecipheriv(
27
+ ALGORITHM,
28
+ getKey(),
29
+ Buffer.from( ivHex, 'hex' )
30
+ );
31
+
32
+ decipher.setAuthTag( Buffer.from( tagHex, 'hex' ) );
33
+
34
+ const result = Buffer.concat([
35
+ decipher.update( Buffer.from( dataHex, 'hex' ) ),
36
+ decipher.final()
37
+ ]);
38
+
39
+ return JSON.parse( result.toString( 'utf8' ) );
40
+
41
+ };
42
+
43
+ module.exports = {
44
+ decrypt,
45
+ encrypt
46
+ };
@@ -0,0 +1,33 @@
1
+ // encrypt.js
2
+ var crypto = require("crypto");
3
+ var ALGORITHM = "aes-256-gcm";
4
+ var getKey = () => Buffer.from(process.env.ENCRYPTION_KEY, "hex");
5
+ var encrypt = (value) => {
6
+ const iv = crypto.randomBytes(12);
7
+ const cipher = crypto.createCipheriv(ALGORITHM, getKey(), iv);
8
+ const data = Buffer.concat([
9
+ cipher.update(JSON.stringify(value), "utf8"),
10
+ cipher.final()
11
+ ]);
12
+ const tag = cipher.getAuthTag();
13
+ return [iv, tag, data].map((b) => b.toString("hex")).join(":");
14
+ };
15
+ var decrypt = (value) => {
16
+ if (typeof value !== "string") return value;
17
+ const [ivHex, tagHex, dataHex] = value.split(":");
18
+ const decipher = crypto.createDecipheriv(
19
+ ALGORITHM,
20
+ getKey(),
21
+ Buffer.from(ivHex, "hex")
22
+ );
23
+ decipher.setAuthTag(Buffer.from(tagHex, "hex"));
24
+ const result = Buffer.concat([
25
+ decipher.update(Buffer.from(dataHex, "hex")),
26
+ decipher.final()
27
+ ]);
28
+ return JSON.parse(result.toString("utf8"));
29
+ };
30
+ module.exports = {
31
+ decrypt,
32
+ encrypt
33
+ };
@@ -0,0 +1,43 @@
1
+ import {
2
+ __commonJS,
3
+ __require
4
+ } from "./chunk-EBO3CZXG.mjs";
5
+
6
+ // encrypt.js
7
+ var require_encrypt = __commonJS({
8
+ "encrypt.js"(exports, module) {
9
+ var crypto = __require("crypto");
10
+ var ALGORITHM = "aes-256-gcm";
11
+ var getKey = () => Buffer.from(process.env.ENCRYPTION_KEY, "hex");
12
+ var encrypt = (value) => {
13
+ const iv = crypto.randomBytes(12);
14
+ const cipher = crypto.createCipheriv(ALGORITHM, getKey(), iv);
15
+ const data = Buffer.concat([
16
+ cipher.update(JSON.stringify(value), "utf8"),
17
+ cipher.final()
18
+ ]);
19
+ const tag = cipher.getAuthTag();
20
+ return [iv, tag, data].map((b) => b.toString("hex")).join(":");
21
+ };
22
+ var decrypt = (value) => {
23
+ if (typeof value !== "string") return value;
24
+ const [ivHex, tagHex, dataHex] = value.split(":");
25
+ const decipher = crypto.createDecipheriv(
26
+ ALGORITHM,
27
+ getKey(),
28
+ Buffer.from(ivHex, "hex")
29
+ );
30
+ decipher.setAuthTag(Buffer.from(tagHex, "hex"));
31
+ const result = Buffer.concat([
32
+ decipher.update(Buffer.from(dataHex, "hex")),
33
+ decipher.final()
34
+ ]);
35
+ return JSON.parse(result.toString("utf8"));
36
+ };
37
+ module.exports = {
38
+ decrypt,
39
+ encrypt
40
+ };
41
+ }
42
+ });
43
+ export default require_encrypt();
package/dist/index.d.mts CHANGED
@@ -1,3 +1,7 @@
1
+ const { code, data } = require( 'currency-codes' );
2
+
3
+ const constants = require( './lib/constants' );
4
+
1
5
  const infinite = 1e300;
2
6
 
3
7
  const isInfinite = ( value ) => value === infinite;
@@ -7,12 +11,43 @@ const gigabyte = ( megabyte * 1024 );
7
11
 
8
12
  const urlRoot = ( string ) => ( string?.includes( 'https' ) ? 'https://' : 'http://' );
9
13
 
14
+ const bytesToGB = ( bytes ) => {
15
+
16
+ const divide = ( 1024 * 1024 * 1024 );
17
+
18
+ return bytes ? Number( bytes ) / divide : 0;
19
+
20
+ };
21
+
22
+ const bytesToMB = ( bytes ) => {
23
+
24
+ const divide = ( 1024 * 1024 );
25
+
26
+ return bytes ? Number( bytes ) / divide : 0;
27
+
28
+ };
29
+
10
30
  const capitalize = ( string ) => {
11
31
 
12
32
  return string?.charAt( 0 )?.toUpperCase() + string?.slice( 1 );
13
33
 
14
34
  };
15
35
 
36
+ const expiredPaymentMethod = ( card ) => {
37
+
38
+ const currentDate = new Date();
39
+ const year = currentDate.getFullYear();
40
+ const month = new Date().getMonth();
41
+
42
+ const expired = [
43
+ card?.year < year,
44
+ card?.year === year && card?.month <= month
45
+ ].filter( Boolean );
46
+
47
+ return Boolean( expired?.length );
48
+
49
+ };
50
+
16
51
  const formatCurrency = ({
17
52
  code = 'USD',
18
53
  digits = 2,
@@ -99,6 +134,39 @@ const getPlanFeature = ( plan, key ) => {
99
134
 
100
135
  };
101
136
 
137
+ const percentage = ( value1, value2, decimals = 1 ) => ( ( ( ( value1 || 0 ) / ( value2 || 0 ) ) * 100 ) || 0 ).toFixed( decimals );
138
+
139
+ const reducers = {
140
+ fields : ( data = [], callback = () => ({}) ) => data.reduce(
141
+ ( accumulator, field ) => {
142
+
143
+ const type = field?.type;
144
+
145
+ if( ! accumulator[ type ] ) return accumulator;
146
+
147
+ accumulator[ type ].items.push({
148
+ ...field,
149
+ ...callback( field )
150
+ });
151
+
152
+ accumulator[ type ].keys.push( field?.slug );
153
+
154
+ return accumulator;
155
+
156
+ },
157
+ {
158
+ additional : {
159
+ items : [],
160
+ keys : []
161
+ },
162
+ lead : {
163
+ items : [],
164
+ keys : []
165
+ }
166
+ }
167
+ )
168
+ };
169
+
102
170
  const regex = {
103
171
  domain : /^([a-zA-Z0-9-]+\.)+[a-zA-Z]{2,}$/,
104
172
  protocols : /^(https?:\/\/)?(www\.)?/,
@@ -111,8 +179,11 @@ const shareUrls = ({
111
179
  page
112
180
  }) => {
113
181
 
114
- const preface = urlRoot( formUri );
115
- const base = formUri;
182
+ const resolvedFormUri = formUri
183
+ || ( typeof process !== 'undefined' ? process.env?.APP_CLIENT_FORM_URI : undefined );
184
+
185
+ const preface = urlRoot( resolvedFormUri );
186
+ const base = resolvedFormUri;
116
187
 
117
188
  const qr = preface + base?.replace( preface, '' ) + '/' + page?.shortId + '?qr=1';
118
189
  const short = preface + base?.replace( preface, '' ) + '/' + page?.shortId;
@@ -153,8 +224,22 @@ const shareUrls = ({
153
224
 
154
225
  };
155
226
 
227
+ const currencies = data.map( ( item ) => ({
228
+ ...item,
229
+ key : item.currency,
230
+ value : item.code
231
+ }));
232
+
233
+ const currency = ( val ) => code( val );
234
+
156
235
  module.exports = {
236
+ bytesToGB,
237
+ bytesToMB,
157
238
  capitalize,
239
+ constants,
240
+ currencies,
241
+ currency,
242
+ expiredPaymentMethod,
158
243
  formatCurrency,
159
244
  formatDateString,
160
245
  formatNumber,
@@ -163,6 +248,8 @@ module.exports = {
163
248
  infinite,
164
249
  isInfinite,
165
250
  megabyte,
251
+ percentage,
252
+ reducers,
166
253
  regex,
167
254
  shareUrls,
168
255
  urlRoot
package/dist/index.d.ts CHANGED
@@ -1,3 +1,7 @@
1
+ const { code, data } = require( 'currency-codes' );
2
+
3
+ const constants = require( './lib/constants' );
4
+
1
5
  const infinite = 1e300;
2
6
 
3
7
  const isInfinite = ( value ) => value === infinite;
@@ -7,12 +11,43 @@ const gigabyte = ( megabyte * 1024 );
7
11
 
8
12
  const urlRoot = ( string ) => ( string?.includes( 'https' ) ? 'https://' : 'http://' );
9
13
 
14
+ const bytesToGB = ( bytes ) => {
15
+
16
+ const divide = ( 1024 * 1024 * 1024 );
17
+
18
+ return bytes ? Number( bytes ) / divide : 0;
19
+
20
+ };
21
+
22
+ const bytesToMB = ( bytes ) => {
23
+
24
+ const divide = ( 1024 * 1024 );
25
+
26
+ return bytes ? Number( bytes ) / divide : 0;
27
+
28
+ };
29
+
10
30
  const capitalize = ( string ) => {
11
31
 
12
32
  return string?.charAt( 0 )?.toUpperCase() + string?.slice( 1 );
13
33
 
14
34
  };
15
35
 
36
+ const expiredPaymentMethod = ( card ) => {
37
+
38
+ const currentDate = new Date();
39
+ const year = currentDate.getFullYear();
40
+ const month = new Date().getMonth();
41
+
42
+ const expired = [
43
+ card?.year < year,
44
+ card?.year === year && card?.month <= month
45
+ ].filter( Boolean );
46
+
47
+ return Boolean( expired?.length );
48
+
49
+ };
50
+
16
51
  const formatCurrency = ({
17
52
  code = 'USD',
18
53
  digits = 2,
@@ -99,6 +134,39 @@ const getPlanFeature = ( plan, key ) => {
99
134
 
100
135
  };
101
136
 
137
+ const percentage = ( value1, value2, decimals = 1 ) => ( ( ( ( value1 || 0 ) / ( value2 || 0 ) ) * 100 ) || 0 ).toFixed( decimals );
138
+
139
+ const reducers = {
140
+ fields : ( data = [], callback = () => ({}) ) => data.reduce(
141
+ ( accumulator, field ) => {
142
+
143
+ const type = field?.type;
144
+
145
+ if( ! accumulator[ type ] ) return accumulator;
146
+
147
+ accumulator[ type ].items.push({
148
+ ...field,
149
+ ...callback( field )
150
+ });
151
+
152
+ accumulator[ type ].keys.push( field?.slug );
153
+
154
+ return accumulator;
155
+
156
+ },
157
+ {
158
+ additional : {
159
+ items : [],
160
+ keys : []
161
+ },
162
+ lead : {
163
+ items : [],
164
+ keys : []
165
+ }
166
+ }
167
+ )
168
+ };
169
+
102
170
  const regex = {
103
171
  domain : /^([a-zA-Z0-9-]+\.)+[a-zA-Z]{2,}$/,
104
172
  protocols : /^(https?:\/\/)?(www\.)?/,
@@ -111,8 +179,11 @@ const shareUrls = ({
111
179
  page
112
180
  }) => {
113
181
 
114
- const preface = urlRoot( formUri );
115
- const base = formUri;
182
+ const resolvedFormUri = formUri
183
+ || ( typeof process !== 'undefined' ? process.env?.APP_CLIENT_FORM_URI : undefined );
184
+
185
+ const preface = urlRoot( resolvedFormUri );
186
+ const base = resolvedFormUri;
116
187
 
117
188
  const qr = preface + base?.replace( preface, '' ) + '/' + page?.shortId + '?qr=1';
118
189
  const short = preface + base?.replace( preface, '' ) + '/' + page?.shortId;
@@ -153,8 +224,22 @@ const shareUrls = ({
153
224
 
154
225
  };
155
226
 
227
+ const currencies = data.map( ( item ) => ({
228
+ ...item,
229
+ key : item.currency,
230
+ value : item.code
231
+ }));
232
+
233
+ const currency = ( val ) => code( val );
234
+
156
235
  module.exports = {
236
+ bytesToGB,
237
+ bytesToMB,
157
238
  capitalize,
239
+ constants,
240
+ currencies,
241
+ currency,
242
+ expiredPaymentMethod,
158
243
  formatCurrency,
159
244
  formatDateString,
160
245
  formatNumber,
@@ -163,6 +248,8 @@ module.exports = {
163
248
  infinite,
164
249
  isInfinite,
165
250
  megabyte,
251
+ percentage,
252
+ reducers,
166
253
  regex,
167
254
  shareUrls,
168
255
  urlRoot
package/dist/index.js CHANGED
@@ -1,15 +1,219 @@
1
+ var __getOwnPropNames = Object.getOwnPropertyNames;
2
+ var __commonJS = (cb, mod) => function __require() {
3
+ return mod || (0, cb[__getOwnPropNames(cb)[0]])((mod = { exports: {} }).exports, mod), mod.exports;
4
+ };
5
+
6
+ // lib/constants.js
7
+ var require_constants = __commonJS({
8
+ "lib/constants.js"(exports2, module2) {
9
+ var font = {
10
+ family: "Roboto Flex",
11
+ transform: "none",
12
+ weight: "regular"
13
+ };
14
+ module2.exports = {
15
+ action: {
16
+ usage: {
17
+ actions: 0
18
+ }
19
+ },
20
+ brand: {
21
+ style: {
22
+ body: font,
23
+ heading: font
24
+ },
25
+ totals: {
26
+ campaigns: 0
27
+ }
28
+ },
29
+ campaign: {
30
+ agreements: {
31
+ marketing: {
32
+ enabled: false,
33
+ label: "I agree to the marketing terms and conditions",
34
+ link: null
35
+ },
36
+ terms: {
37
+ enabled: false,
38
+ label: "I agree to the terms and conditions",
39
+ link: null
40
+ }
41
+ },
42
+ defaults: {
43
+ active: "Enter",
44
+ confirmation: "Submission was successful",
45
+ inactive: "Submissions are closed",
46
+ email: "You were selected"
47
+ },
48
+ notifications: {
49
+ draw: {
50
+ subject: "You have been selected",
51
+ body: "Thanks for being part of our giveaway"
52
+ }
53
+ },
54
+ settings: {
55
+ submissionLeadPrimaryKey: "email",
56
+ submissionEntryMaximum: 1,
57
+ submissionEntryFilter: "campaign",
58
+ submissionEntryHighscore: false,
59
+ submissionEntryLimit: 1
60
+ },
61
+ status: "drafted",
62
+ totals: {
63
+ advertisements: 0,
64
+ affiliates: 0,
65
+ draws: 0,
66
+ exports: 0,
67
+ entries: 0,
68
+ fields: 2,
69
+ integrations: 1,
70
+ leads: 0,
71
+ links: 0,
72
+ pages: 0,
73
+ prizes: 0,
74
+ ranges: 0,
75
+ submissions: 0
76
+ },
77
+ type: "giveaway"
78
+ },
79
+ draw: {
80
+ status: "qualified",
81
+ totals: {
82
+ notifications: 0
83
+ }
84
+ },
85
+ member: {
86
+ status: "pending"
87
+ },
88
+ organization: {
89
+ errors: [],
90
+ totals: {
91
+ affiliates: 0,
92
+ brands: 0,
93
+ campaigns: 0,
94
+ leads: 0,
95
+ draws: 0,
96
+ entries: 0,
97
+ invitations: 0,
98
+ invoices: 0,
99
+ members: 0,
100
+ ranges: 0,
101
+ pages: 0,
102
+ prizes: 0,
103
+ storage: 0,
104
+ submissions: 0,
105
+ subscriptions: 0,
106
+ usage: 0
107
+ }
108
+ },
109
+ page: {
110
+ domains: [],
111
+ status: "drafted",
112
+ totals: {
113
+ leads: 0,
114
+ entries: 0,
115
+ submissions: 0
116
+ }
117
+ },
118
+ prize: {
119
+ inventory: 0,
120
+ remaining: 0,
121
+ shipping: false,
122
+ status: "drafted",
123
+ totals: {
124
+ draws: 0
125
+ }
126
+ },
127
+ range: {
128
+ totals: {
129
+ leads: 0,
130
+ entries: 0,
131
+ submissions: 0
132
+ }
133
+ },
134
+ referrer: {
135
+ totals: {
136
+ originizations: 0,
137
+ subscriptions: 0,
138
+ users: 0
139
+ }
140
+ },
141
+ template: {
142
+ page: {
143
+ style: {
144
+ body: font,
145
+ heading: font
146
+ }
147
+ }
148
+ },
149
+ usage: {
150
+ totals: {
151
+ actions: 0,
152
+ affiliates: 0,
153
+ brands: 0,
154
+ campaigns: 0,
155
+ connections: 0,
156
+ entries: 0,
157
+ files: 0,
158
+ members: 0,
159
+ orders: 0,
160
+ pages: 0,
161
+ revenue: 0,
162
+ storage: 0,
163
+ submissions: 0,
164
+ workflows: 0
165
+ }
166
+ },
167
+ user: {
168
+ access: {
169
+ ai: false
170
+ },
171
+ image: null,
172
+ totals: {
173
+ inbox: 0,
174
+ invitations: 0,
175
+ messages: 0,
176
+ methods: 0,
177
+ organizations: 1,
178
+ teams: 0
179
+ }
180
+ }
181
+ };
182
+ }
183
+ });
184
+
1
185
  // index.js
186
+ var { code, data } = require("currency-codes");
187
+ var constants = require_constants();
2
188
  var infinite = 1e300;
3
189
  var isInfinite = (value) => value === infinite;
4
190
  var megabyte = 1024 * 1024;
5
191
  var gigabyte = megabyte * 1024;
6
192
  var urlRoot = (string) => (string == null ? void 0 : string.includes("https")) ? "https://" : "http://";
193
+ var bytesToGB = (bytes) => {
194
+ const divide = 1024 * 1024 * 1024;
195
+ return bytes ? Number(bytes) / divide : 0;
196
+ };
197
+ var bytesToMB = (bytes) => {
198
+ const divide = 1024 * 1024;
199
+ return bytes ? Number(bytes) / divide : 0;
200
+ };
7
201
  var capitalize = (string) => {
8
202
  var _a;
9
203
  return ((_a = string == null ? void 0 : string.charAt(0)) == null ? void 0 : _a.toUpperCase()) + (string == null ? void 0 : string.slice(1));
10
204
  };
205
+ var expiredPaymentMethod = (card) => {
206
+ const currentDate = /* @__PURE__ */ new Date();
207
+ const year = currentDate.getFullYear();
208
+ const month = (/* @__PURE__ */ new Date()).getMonth();
209
+ const expired = [
210
+ (card == null ? void 0 : card.year) < year,
211
+ (card == null ? void 0 : card.year) === year && (card == null ? void 0 : card.month) <= month
212
+ ].filter(Boolean);
213
+ return Boolean(expired == null ? void 0 : expired.length);
214
+ };
11
215
  var formatCurrency = ({
12
- code = "USD",
216
+ code: code2 = "USD",
13
217
  digits = 2,
14
218
  display = "standard",
15
219
  locale,
@@ -18,7 +222,7 @@ var formatCurrency = ({
18
222
  var _a;
19
223
  const resolvedLocale = locale || (typeof navigator !== "undefined" ? navigator == null ? void 0 : navigator.language : null) || "en-US";
20
224
  const options = {
21
- currency: code,
225
+ currency: code2,
22
226
  minimumFractionDigits: digits,
23
227
  maximumFractionDigits: digits,
24
228
  style: "currency"
@@ -28,7 +232,7 @@ var formatCurrency = ({
28
232
  const parts = new Intl.NumberFormat(resolvedLocale, options).formatToParts(value);
29
233
  const symbol = ((_a = parts.find((p) => p.type === "currency")) == null ? void 0 : _a.value) || "";
30
234
  const number = parts.filter((p) => p.type !== "currency" && p.type !== "literal").map((p) => p.value).join("");
31
- return symbol + number + " " + code;
235
+ return symbol + number + " " + code2;
32
236
  }
33
237
  ;
34
238
  return new Intl.NumberFormat(resolvedLocale, options).format(value);
@@ -66,6 +270,31 @@ var getPlanFeature = (plan, key) => {
66
270
  message: granted ? feature : error
67
271
  };
68
272
  };
273
+ var percentage = (value1, value2, decimals = 1) => ((value1 || 0) / (value2 || 0) * 100 || 0).toFixed(decimals);
274
+ var reducers = {
275
+ fields: (data2 = [], callback = () => ({})) => data2.reduce(
276
+ (accumulator, field) => {
277
+ const type = field == null ? void 0 : field.type;
278
+ if (!accumulator[type]) return accumulator;
279
+ accumulator[type].items.push({
280
+ ...field,
281
+ ...callback(field)
282
+ });
283
+ accumulator[type].keys.push(field == null ? void 0 : field.slug);
284
+ return accumulator;
285
+ },
286
+ {
287
+ additional: {
288
+ items: [],
289
+ keys: []
290
+ },
291
+ lead: {
292
+ items: [],
293
+ keys: []
294
+ }
295
+ }
296
+ )
297
+ };
69
298
  var regex = {
70
299
  domain: /^([a-zA-Z0-9-]+\.)+[a-zA-Z]{2,}$/,
71
300
  protocols: /^(https?:\/\/)?(www\.)?/,
@@ -76,8 +305,10 @@ var shareUrls = ({
76
305
  organization,
77
306
  page
78
307
  }) => {
79
- const preface = urlRoot(formUri);
80
- const base = formUri;
308
+ var _a;
309
+ const resolvedFormUri = formUri || (typeof process !== "undefined" ? (_a = process.env) == null ? void 0 : _a.APP_CLIENT_FORM_URI : void 0);
310
+ const preface = urlRoot(resolvedFormUri);
311
+ const base = resolvedFormUri;
81
312
  const qr = preface + (base == null ? void 0 : base.replace(preface, "")) + "/" + (page == null ? void 0 : page.shortId) + "?qr=1";
82
313
  const short = preface + (base == null ? void 0 : base.replace(preface, "")) + "/" + (page == null ? void 0 : page.shortId);
83
314
  const url = preface + (organization == null ? void 0 : organization.subdomain) + "." + (base == null ? void 0 : base.replace(preface, "")) + "/" + (page == null ? void 0 : page.slug);
@@ -110,8 +341,20 @@ var shareUrls = ({
110
341
  urls
111
342
  };
112
343
  };
344
+ var currencies = data.map((item) => ({
345
+ ...item,
346
+ key: item.currency,
347
+ value: item.code
348
+ }));
349
+ var currency = (val) => code(val);
113
350
  module.exports = {
351
+ bytesToGB,
352
+ bytesToMB,
114
353
  capitalize,
354
+ constants,
355
+ currencies,
356
+ currency,
357
+ expiredPaymentMethod,
115
358
  formatCurrency,
116
359
  formatDateString,
117
360
  formatNumber,
@@ -120,6 +363,8 @@ module.exports = {
120
363
  infinite,
121
364
  isInfinite,
122
365
  megabyte,
366
+ percentage,
367
+ reducers,
123
368
  regex,
124
369
  shareUrls,
125
370
  urlRoot
package/dist/index.mjs CHANGED
@@ -1,22 +1,221 @@
1
- var __getOwnPropNames = Object.getOwnPropertyNames;
2
- var __commonJS = (cb, mod) => function __require() {
3
- return mod || (0, cb[__getOwnPropNames(cb)[0]])((mod = { exports: {} }).exports, mod), mod.exports;
4
- };
1
+ import {
2
+ __commonJS,
3
+ __require
4
+ } from "./chunk-EBO3CZXG.mjs";
5
+
6
+ // lib/constants.js
7
+ var require_constants = __commonJS({
8
+ "lib/constants.js"(exports, module) {
9
+ var font = {
10
+ family: "Roboto Flex",
11
+ transform: "none",
12
+ weight: "regular"
13
+ };
14
+ module.exports = {
15
+ action: {
16
+ usage: {
17
+ actions: 0
18
+ }
19
+ },
20
+ brand: {
21
+ style: {
22
+ body: font,
23
+ heading: font
24
+ },
25
+ totals: {
26
+ campaigns: 0
27
+ }
28
+ },
29
+ campaign: {
30
+ agreements: {
31
+ marketing: {
32
+ enabled: false,
33
+ label: "I agree to the marketing terms and conditions",
34
+ link: null
35
+ },
36
+ terms: {
37
+ enabled: false,
38
+ label: "I agree to the terms and conditions",
39
+ link: null
40
+ }
41
+ },
42
+ defaults: {
43
+ active: "Enter",
44
+ confirmation: "Submission was successful",
45
+ inactive: "Submissions are closed",
46
+ email: "You were selected"
47
+ },
48
+ notifications: {
49
+ draw: {
50
+ subject: "You have been selected",
51
+ body: "Thanks for being part of our giveaway"
52
+ }
53
+ },
54
+ settings: {
55
+ submissionLeadPrimaryKey: "email",
56
+ submissionEntryMaximum: 1,
57
+ submissionEntryFilter: "campaign",
58
+ submissionEntryHighscore: false,
59
+ submissionEntryLimit: 1
60
+ },
61
+ status: "drafted",
62
+ totals: {
63
+ advertisements: 0,
64
+ affiliates: 0,
65
+ draws: 0,
66
+ exports: 0,
67
+ entries: 0,
68
+ fields: 2,
69
+ integrations: 1,
70
+ leads: 0,
71
+ links: 0,
72
+ pages: 0,
73
+ prizes: 0,
74
+ ranges: 0,
75
+ submissions: 0
76
+ },
77
+ type: "giveaway"
78
+ },
79
+ draw: {
80
+ status: "qualified",
81
+ totals: {
82
+ notifications: 0
83
+ }
84
+ },
85
+ member: {
86
+ status: "pending"
87
+ },
88
+ organization: {
89
+ errors: [],
90
+ totals: {
91
+ affiliates: 0,
92
+ brands: 0,
93
+ campaigns: 0,
94
+ leads: 0,
95
+ draws: 0,
96
+ entries: 0,
97
+ invitations: 0,
98
+ invoices: 0,
99
+ members: 0,
100
+ ranges: 0,
101
+ pages: 0,
102
+ prizes: 0,
103
+ storage: 0,
104
+ submissions: 0,
105
+ subscriptions: 0,
106
+ usage: 0
107
+ }
108
+ },
109
+ page: {
110
+ domains: [],
111
+ status: "drafted",
112
+ totals: {
113
+ leads: 0,
114
+ entries: 0,
115
+ submissions: 0
116
+ }
117
+ },
118
+ prize: {
119
+ inventory: 0,
120
+ remaining: 0,
121
+ shipping: false,
122
+ status: "drafted",
123
+ totals: {
124
+ draws: 0
125
+ }
126
+ },
127
+ range: {
128
+ totals: {
129
+ leads: 0,
130
+ entries: 0,
131
+ submissions: 0
132
+ }
133
+ },
134
+ referrer: {
135
+ totals: {
136
+ originizations: 0,
137
+ subscriptions: 0,
138
+ users: 0
139
+ }
140
+ },
141
+ template: {
142
+ page: {
143
+ style: {
144
+ body: font,
145
+ heading: font
146
+ }
147
+ }
148
+ },
149
+ usage: {
150
+ totals: {
151
+ actions: 0,
152
+ affiliates: 0,
153
+ brands: 0,
154
+ campaigns: 0,
155
+ connections: 0,
156
+ entries: 0,
157
+ files: 0,
158
+ members: 0,
159
+ orders: 0,
160
+ pages: 0,
161
+ revenue: 0,
162
+ storage: 0,
163
+ submissions: 0,
164
+ workflows: 0
165
+ }
166
+ },
167
+ user: {
168
+ access: {
169
+ ai: false
170
+ },
171
+ image: null,
172
+ totals: {
173
+ inbox: 0,
174
+ invitations: 0,
175
+ messages: 0,
176
+ methods: 0,
177
+ organizations: 1,
178
+ teams: 0
179
+ }
180
+ }
181
+ };
182
+ }
183
+ });
5
184
 
6
185
  // index.js
7
186
  var require_index = __commonJS({
8
187
  "index.js"(exports, module) {
188
+ var { code, data } = __require("currency-codes");
189
+ var constants = require_constants();
9
190
  var infinite = 1e300;
10
191
  var isInfinite = (value) => value === infinite;
11
192
  var megabyte = 1024 * 1024;
12
193
  var gigabyte = megabyte * 1024;
13
194
  var urlRoot = (string) => (string == null ? void 0 : string.includes("https")) ? "https://" : "http://";
195
+ var bytesToGB = (bytes) => {
196
+ const divide = 1024 * 1024 * 1024;
197
+ return bytes ? Number(bytes) / divide : 0;
198
+ };
199
+ var bytesToMB = (bytes) => {
200
+ const divide = 1024 * 1024;
201
+ return bytes ? Number(bytes) / divide : 0;
202
+ };
14
203
  var capitalize = (string) => {
15
204
  var _a;
16
205
  return ((_a = string == null ? void 0 : string.charAt(0)) == null ? void 0 : _a.toUpperCase()) + (string == null ? void 0 : string.slice(1));
17
206
  };
207
+ var expiredPaymentMethod = (card) => {
208
+ const currentDate = /* @__PURE__ */ new Date();
209
+ const year = currentDate.getFullYear();
210
+ const month = (/* @__PURE__ */ new Date()).getMonth();
211
+ const expired = [
212
+ (card == null ? void 0 : card.year) < year,
213
+ (card == null ? void 0 : card.year) === year && (card == null ? void 0 : card.month) <= month
214
+ ].filter(Boolean);
215
+ return Boolean(expired == null ? void 0 : expired.length);
216
+ };
18
217
  var formatCurrency = ({
19
- code = "USD",
218
+ code: code2 = "USD",
20
219
  digits = 2,
21
220
  display = "standard",
22
221
  locale,
@@ -25,7 +224,7 @@ var require_index = __commonJS({
25
224
  var _a;
26
225
  const resolvedLocale = locale || (typeof navigator !== "undefined" ? navigator == null ? void 0 : navigator.language : null) || "en-US";
27
226
  const options = {
28
- currency: code,
227
+ currency: code2,
29
228
  minimumFractionDigits: digits,
30
229
  maximumFractionDigits: digits,
31
230
  style: "currency"
@@ -35,7 +234,7 @@ var require_index = __commonJS({
35
234
  const parts = new Intl.NumberFormat(resolvedLocale, options).formatToParts(value);
36
235
  const symbol = ((_a = parts.find((p) => p.type === "currency")) == null ? void 0 : _a.value) || "";
37
236
  const number = parts.filter((p) => p.type !== "currency" && p.type !== "literal").map((p) => p.value).join("");
38
- return symbol + number + " " + code;
237
+ return symbol + number + " " + code2;
39
238
  }
40
239
  ;
41
240
  return new Intl.NumberFormat(resolvedLocale, options).format(value);
@@ -73,6 +272,31 @@ var require_index = __commonJS({
73
272
  message: granted ? feature : error
74
273
  };
75
274
  };
275
+ var percentage = (value1, value2, decimals = 1) => ((value1 || 0) / (value2 || 0) * 100 || 0).toFixed(decimals);
276
+ var reducers = {
277
+ fields: (data2 = [], callback = () => ({})) => data2.reduce(
278
+ (accumulator, field) => {
279
+ const type = field == null ? void 0 : field.type;
280
+ if (!accumulator[type]) return accumulator;
281
+ accumulator[type].items.push({
282
+ ...field,
283
+ ...callback(field)
284
+ });
285
+ accumulator[type].keys.push(field == null ? void 0 : field.slug);
286
+ return accumulator;
287
+ },
288
+ {
289
+ additional: {
290
+ items: [],
291
+ keys: []
292
+ },
293
+ lead: {
294
+ items: [],
295
+ keys: []
296
+ }
297
+ }
298
+ )
299
+ };
76
300
  var regex = {
77
301
  domain: /^([a-zA-Z0-9-]+\.)+[a-zA-Z]{2,}$/,
78
302
  protocols: /^(https?:\/\/)?(www\.)?/,
@@ -83,8 +307,10 @@ var require_index = __commonJS({
83
307
  organization,
84
308
  page
85
309
  }) => {
86
- const preface = urlRoot(formUri);
87
- const base = formUri;
310
+ var _a;
311
+ const resolvedFormUri = formUri || (typeof process !== "undefined" ? (_a = process.env) == null ? void 0 : _a.APP_CLIENT_FORM_URI : void 0);
312
+ const preface = urlRoot(resolvedFormUri);
313
+ const base = resolvedFormUri;
88
314
  const qr = preface + (base == null ? void 0 : base.replace(preface, "")) + "/" + (page == null ? void 0 : page.shortId) + "?qr=1";
89
315
  const short = preface + (base == null ? void 0 : base.replace(preface, "")) + "/" + (page == null ? void 0 : page.shortId);
90
316
  const url = preface + (organization == null ? void 0 : organization.subdomain) + "." + (base == null ? void 0 : base.replace(preface, "")) + "/" + (page == null ? void 0 : page.slug);
@@ -117,8 +343,20 @@ var require_index = __commonJS({
117
343
  urls
118
344
  };
119
345
  };
346
+ var currencies = data.map((item) => ({
347
+ ...item,
348
+ key: item.currency,
349
+ value: item.code
350
+ }));
351
+ var currency = (val) => code(val);
120
352
  module.exports = {
353
+ bytesToGB,
354
+ bytesToMB,
121
355
  capitalize,
356
+ constants,
357
+ currencies,
358
+ currency,
359
+ expiredPaymentMethod,
122
360
  formatCurrency,
123
361
  formatDateString,
124
362
  formatNumber,
@@ -127,6 +365,8 @@ var require_index = __commonJS({
127
365
  infinite,
128
366
  isInfinite,
129
367
  megabyte,
368
+ percentage,
369
+ reducers,
130
370
  regex,
131
371
  shareUrls,
132
372
  urlRoot
package/package.json CHANGED
@@ -1,5 +1,6 @@
1
1
  {
2
2
  "dependencies": {
3
+ "currency-codes": "2.2.0",
3
4
  "tsup": "8.5.1",
4
5
  "typescript": "5.9.3"
5
6
  },
@@ -8,6 +9,11 @@
8
9
  "types": "./dist/index.d.ts",
9
10
  "import": "./dist/index.mjs",
10
11
  "require": "./dist/index.js"
12
+ },
13
+ "./encrypt": {
14
+ "types": "./dist/encrypt.d.ts",
15
+ "import": "./dist/encrypt.mjs",
16
+ "require": "./dist/encrypt.js"
11
17
  }
12
18
  },
13
19
  "files": [
@@ -21,8 +27,8 @@
21
27
  "access": "public"
22
28
  },
23
29
  "scripts": {
24
- "build": "tsup ./index.js && npm publish"
30
+ "build": "tsup && npm publish"
25
31
  },
26
32
  "types": "dist/index.d.ts",
27
- "version": "0.0.2"
33
+ "version": "0.0.3"
28
34
  }