@sensefolks/fastpoll 0.1.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 (107) hide show
  1. package/CHANGELOG.md +24 -0
  2. package/LICENSE +21 -0
  3. package/dist/cjs/app-globals-V2Kpy_OQ.js +8 -0
  4. package/dist/cjs/app-globals-V2Kpy_OQ.js.map +1 -0
  5. package/dist/cjs/index-CC5IS5t8.js +1437 -0
  6. package/dist/cjs/index-CC5IS5t8.js.map +1 -0
  7. package/dist/cjs/index-D8TNlmQq.js +201 -0
  8. package/dist/cjs/index-D8TNlmQq.js.map +1 -0
  9. package/dist/cjs/index.cjs.js +11 -0
  10. package/dist/cjs/index.cjs.js.map +1 -0
  11. package/dist/cjs/loader.cjs.js +16 -0
  12. package/dist/cjs/loader.cjs.js.map +1 -0
  13. package/dist/cjs/sf-fastpoll.cjs.entry.js +395 -0
  14. package/dist/cjs/sf-fastpoll.cjs.entry.js.map +1 -0
  15. package/dist/cjs/sf-fastpoll.cjs.js +28 -0
  16. package/dist/cjs/sf-fastpoll.cjs.js.map +1 -0
  17. package/dist/cjs/sf-fastpoll.entry.cjs.js.map +1 -0
  18. package/dist/collection/collection-manifest.json +12 -0
  19. package/dist/collection/components/sf-fastpoll/sf-fastpoll.css +76 -0
  20. package/dist/collection/components/sf-fastpoll/sf-fastpoll.js +454 -0
  21. package/dist/collection/components/sf-fastpoll/sf-fastpoll.js.map +1 -0
  22. package/dist/collection/index.js +11 -0
  23. package/dist/collection/index.js.map +1 -0
  24. package/dist/collection/utils/utils.js +189 -0
  25. package/dist/collection/utils/utils.js.map +1 -0
  26. package/dist/components/index.d.ts +33 -0
  27. package/dist/components/index.js +1427 -0
  28. package/dist/components/index.js.map +1 -0
  29. package/dist/components/sf-fastpoll.d.ts +11 -0
  30. package/dist/components/sf-fastpoll.js +425 -0
  31. package/dist/components/sf-fastpoll.js.map +1 -0
  32. package/dist/esm/app-globals-DQuL1Twl.js +6 -0
  33. package/dist/esm/app-globals-DQuL1Twl.js.map +1 -0
  34. package/dist/esm/index-CfdIRf0W.js +193 -0
  35. package/dist/esm/index-CfdIRf0W.js.map +1 -0
  36. package/dist/esm/index-XYfqntZe.js +1428 -0
  37. package/dist/esm/index-XYfqntZe.js.map +1 -0
  38. package/dist/esm/index.js +4 -0
  39. package/dist/esm/index.js.map +1 -0
  40. package/dist/esm/loader.js +14 -0
  41. package/dist/esm/loader.js.map +1 -0
  42. package/dist/esm/polyfills/core-js.js +11 -0
  43. package/dist/esm/polyfills/dom.js +79 -0
  44. package/dist/esm/polyfills/es5-html-element.js +1 -0
  45. package/dist/esm/polyfills/index.js +34 -0
  46. package/dist/esm/polyfills/system.js +6 -0
  47. package/dist/esm/sf-fastpoll.entry.js +393 -0
  48. package/dist/esm/sf-fastpoll.entry.js.map +1 -0
  49. package/dist/esm/sf-fastpoll.js +24 -0
  50. package/dist/esm/sf-fastpoll.js.map +1 -0
  51. package/dist/esm-es5/app-globals-DQuL1Twl.js +2 -0
  52. package/dist/esm-es5/app-globals-DQuL1Twl.js.map +1 -0
  53. package/dist/esm-es5/index-CfdIRf0W.js +2 -0
  54. package/dist/esm-es5/index-CfdIRf0W.js.map +1 -0
  55. package/dist/esm-es5/index-XYfqntZe.js +3 -0
  56. package/dist/esm-es5/index-XYfqntZe.js.map +1 -0
  57. package/dist/esm-es5/index.js +2 -0
  58. package/dist/esm-es5/index.js.map +1 -0
  59. package/dist/esm-es5/loader.js +2 -0
  60. package/dist/esm-es5/loader.js.map +1 -0
  61. package/dist/esm-es5/sf-fastpoll.entry.js +2 -0
  62. package/dist/esm-es5/sf-fastpoll.entry.js.map +1 -0
  63. package/dist/esm-es5/sf-fastpoll.js +2 -0
  64. package/dist/esm-es5/sf-fastpoll.js.map +1 -0
  65. package/dist/index.cjs.js +1 -0
  66. package/dist/index.js +1 -0
  67. package/dist/sf-fastpoll/index.esm.js +2 -0
  68. package/dist/sf-fastpoll/index.esm.js.map +1 -0
  69. package/dist/sf-fastpoll/loader.esm.js.map +1 -0
  70. package/dist/sf-fastpoll/p-1f6dca2a.system.entry.js +2 -0
  71. package/dist/sf-fastpoll/p-1f6dca2a.system.entry.js.map +1 -0
  72. package/dist/sf-fastpoll/p-4648bca3.entry.js +2 -0
  73. package/dist/sf-fastpoll/p-4648bca3.entry.js.map +1 -0
  74. package/dist/sf-fastpoll/p-BbPAtVJG.system.js +2 -0
  75. package/dist/sf-fastpoll/p-BbPAtVJG.system.js.map +1 -0
  76. package/dist/sf-fastpoll/p-C7EMppj8.system.js.map +1 -0
  77. package/dist/sf-fastpoll/p-C9ESvisV.system.js +3 -0
  78. package/dist/sf-fastpoll/p-C9ESvisV.system.js.map +1 -0
  79. package/dist/sf-fastpoll/p-CfdIRf0W.js +2 -0
  80. package/dist/sf-fastpoll/p-CfdIRf0W.js.map +1 -0
  81. package/dist/sf-fastpoll/p-CpmSDeqe.system.js +2 -0
  82. package/dist/sf-fastpoll/p-CpmSDeqe.system.js.map +1 -0
  83. package/dist/sf-fastpoll/p-DQuL1Twl.js +2 -0
  84. package/dist/sf-fastpoll/p-DQuL1Twl.js.map +1 -0
  85. package/dist/sf-fastpoll/p-JC66e5NR.system.js.map +1 -0
  86. package/dist/sf-fastpoll/p-S-cJYJS7.system.js +2 -0
  87. package/dist/sf-fastpoll/p-S-cJYJS7.system.js.map +1 -0
  88. package/dist/sf-fastpoll/p-XYfqntZe.js +3 -0
  89. package/dist/sf-fastpoll/p-XYfqntZe.js.map +1 -0
  90. package/dist/sf-fastpoll/p-zRZYYxiz.system.js +2 -0
  91. package/dist/sf-fastpoll/p-zRZYYxiz.system.js.map +1 -0
  92. package/dist/sf-fastpoll/sf-fastpoll.entry.esm.js.map +1 -0
  93. package/dist/sf-fastpoll/sf-fastpoll.esm.js +2 -0
  94. package/dist/sf-fastpoll/sf-fastpoll.esm.js.map +1 -0
  95. package/dist/sf-fastpoll/sf-fastpoll.js +127 -0
  96. package/dist/types/components/sf-fastpoll/sf-fastpoll.d.ts +77 -0
  97. package/dist/types/components.d.ts +47 -0
  98. package/dist/types/index.d.ts +11 -0
  99. package/dist/types/stencil-public-runtime.d.ts +1709 -0
  100. package/dist/types/utils/utils.d.ts +86 -0
  101. package/loader/cdn.js +2 -0
  102. package/loader/index.cjs.js +2 -0
  103. package/loader/index.d.ts +24 -0
  104. package/loader/index.es2017.js +2 -0
  105. package/loader/index.js +3 -0
  106. package/package.json +86 -0
  107. package/readme.md +239 -0
@@ -0,0 +1,193 @@
1
+ /**
2
+ * Utility functions for sf-fastpoll
3
+ */
4
+ /**
5
+ * Maximum allowed length for text inputs
6
+ */
7
+ const MAX_TEXT_LENGTH = 500;
8
+ const MAX_EMAIL_LENGTH = 254;
9
+ /**
10
+ * Sanitize user input to prevent XSS and limit length
11
+ * @param input The raw user input
12
+ * @param maxLength Maximum allowed length (default: 500)
13
+ * @returns Sanitized string
14
+ */
15
+ function sanitizeInput(input, maxLength = MAX_TEXT_LENGTH) {
16
+ if (typeof input !== 'string') {
17
+ return '';
18
+ }
19
+ // Trim whitespace
20
+ let sanitized = input.replace(/^\s+|\s+$/g, '');
21
+ // Remove null bytes
22
+ sanitized = sanitized.replace(/\0/g, '');
23
+ // Encode HTML entities to prevent XSS
24
+ sanitized = sanitized.replace(/&/g, '&amp;').replace(/</g, '&lt;').replace(/>/g, '&gt;').replace(/"/g, '&quot;').replace(/'/g, '&#x27;');
25
+ // Truncate to max length
26
+ if (sanitized.length > maxLength) {
27
+ sanitized = sanitized.substring(0, maxLength);
28
+ }
29
+ return sanitized;
30
+ }
31
+ /**
32
+ * Sanitize email input with email-specific rules
33
+ * @param email The raw email input
34
+ * @returns Sanitized email string
35
+ */
36
+ function sanitizeEmail(email) {
37
+ if (typeof email !== 'string') {
38
+ return '';
39
+ }
40
+ // Trim and lowercase
41
+ let sanitized = email.replace(/^\s+|\s+$/g, '').toLowerCase();
42
+ // Remove null bytes and control characters
43
+ sanitized = sanitized.replace(/[\0\x00-\x1F\x7F]/g, '');
44
+ // Truncate to max email length (RFC 5321)
45
+ if (sanitized.length > MAX_EMAIL_LENGTH) {
46
+ sanitized = sanitized.substring(0, MAX_EMAIL_LENGTH);
47
+ }
48
+ return sanitized;
49
+ }
50
+ /**
51
+ * Sanitize a value based on field type
52
+ * @param value The raw value
53
+ * @param inputType The type of input field
54
+ * @returns Sanitized value
55
+ */
56
+ function sanitizeByType(value, inputType) {
57
+ switch (inputType) {
58
+ case 'email':
59
+ return sanitizeEmail(value);
60
+ case 'number':
61
+ // Only allow digits, decimal point, and minus sign
62
+ const numStr = String(value).replace(/[^0-9.\-]/g, '');
63
+ return numStr.substring(0, 20); // Reasonable max for numbers
64
+ case 'dropdown':
65
+ case 'radio':
66
+ // For select/radio, sanitize but be more permissive (values come from config)
67
+ return sanitizeInput(value, 100);
68
+ case 'checkbox':
69
+ // Checkbox values are comma-separated, sanitize each
70
+ return value
71
+ .split(',')
72
+ .map(v => sanitizeInput(v.replace(/^\s+|\s+$/g, ''), 100))
73
+ .join(', ');
74
+ default:
75
+ return sanitizeInput(value);
76
+ }
77
+ }
78
+ /**
79
+ * Check if a survey key is valid UUID
80
+ * @param key The survey key to validate
81
+ * @returns True if the key is a valid UUID, false otherwise
82
+ */
83
+ function isValidKey(key) {
84
+ if (typeof key !== 'string' || key.trim().length === 0) {
85
+ return false;
86
+ }
87
+ // UUID v4 regex pattern
88
+ const uuidRegex = /^[0-9a-f]{8}-[0-9a-f]{4}-[1-5][0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$/i;
89
+ return uuidRegex.test(key.trim());
90
+ }
91
+ /**
92
+ * Format error messages for display
93
+ * @param error The error object or message
94
+ * @returns A formatted error message string
95
+ */
96
+ function formatErrorMessage(error) {
97
+ if (typeof error === 'string') {
98
+ return error;
99
+ }
100
+ if (error instanceof Error) {
101
+ return error.message;
102
+ }
103
+ return 'An unknown error occurred';
104
+ }
105
+ /**
106
+ * Browser-compatible helper to check if array contains a value
107
+ * @param array The array to search
108
+ * @param value The value to find
109
+ * @returns true if value is found in array
110
+ */
111
+ function arrayContains(array, value) {
112
+ for (let i = 0; i < array.length; i++) {
113
+ if (array[i] === value) {
114
+ return true;
115
+ }
116
+ }
117
+ return false;
118
+ }
119
+ /**
120
+ * Browser-compatible helper to trim and split comma-separated values
121
+ * @param value The comma-separated string
122
+ * @returns Array of trimmed values
123
+ */
124
+ function parseCommaSeparatedValues(value) {
125
+ if (!value) {
126
+ return [];
127
+ }
128
+ const parts = value.split(',');
129
+ const result = [];
130
+ for (let i = 0; i < parts.length; i++) {
131
+ const trimmed = parts[i].replace(/^\s+|\s+$/g, ''); // Manual trim for IE compatibility
132
+ if (trimmed) {
133
+ result.push(trimmed);
134
+ }
135
+ }
136
+ return result;
137
+ }
138
+ /**
139
+ * Get field configuration for rendering
140
+ * @param detail The respondent detail configuration
141
+ * @param value The current value of the field
142
+ * @returns Field configuration object
143
+ */
144
+ function getFieldConfig(detail, value) {
145
+ const inputType = detail.inputType || 'text';
146
+ const placeholder = detail.placeholder || 'Enter your ' + detail.label.toLowerCase();
147
+ const required = detail.required !== false;
148
+ return {
149
+ inputType: inputType,
150
+ placeholder: placeholder,
151
+ required: required,
152
+ options: detail.options || [],
153
+ defaultValue: detail.defaultValue,
154
+ hasOptions: detail.options && detail.options.length > 0,
155
+ selectedValues: parseCommaSeparatedValues(value),
156
+ fieldValue: detail.value,
157
+ currentValue: value || '',
158
+ };
159
+ }
160
+ /**
161
+ * Browser-compatible helper to add value to comma-separated list
162
+ * @param currentValue The current comma-separated string
163
+ * @param valueToAdd The value to add
164
+ * @returns Updated comma-separated string
165
+ */
166
+ function addToCommaSeparatedList(currentValue, valueToAdd) {
167
+ const values = parseCommaSeparatedValues(currentValue);
168
+ if (!arrayContains(values, valueToAdd)) {
169
+ values.push(valueToAdd);
170
+ }
171
+ return values.join(', ');
172
+ }
173
+ /**
174
+ * Browser-compatible helper to remove value from comma-separated list
175
+ * @param currentValue The current comma-separated string
176
+ * @param valueToRemove The value to remove
177
+ * @returns Updated comma-separated string
178
+ */
179
+ function removeFromCommaSeparatedList(currentValue, valueToRemove) {
180
+ const values = parseCommaSeparatedValues(currentValue);
181
+ const result = [];
182
+ for (let i = 0; i < values.length; i++) {
183
+ if (values[i] !== valueToRemove) {
184
+ result.push(values[i]);
185
+ }
186
+ }
187
+ return result.join(', ');
188
+ }
189
+
190
+ export { addToCommaSeparatedList as a, sanitizeByType as b, formatErrorMessage as f, getFieldConfig as g, isValidKey as i, removeFromCommaSeparatedList as r, sanitizeInput as s };
191
+ //# sourceMappingURL=index-CfdIRf0W.js.map
192
+
193
+ //# sourceMappingURL=index-CfdIRf0W.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index-CfdIRf0W.js","sources":["src/utils/utils.ts"],"sourcesContent":["/**\n * Utility functions for sf-fastpoll\n */\n\n/**\n * Maximum allowed length for text inputs\n */\nconst MAX_TEXT_LENGTH = 500;\nconst MAX_EMAIL_LENGTH = 254;\n\n/**\n * Sanitize user input to prevent XSS and limit length\n * @param input The raw user input\n * @param maxLength Maximum allowed length (default: 500)\n * @returns Sanitized string\n */\nexport function sanitizeInput(input: string, maxLength: number = MAX_TEXT_LENGTH): string {\n if (typeof input !== 'string') {\n return '';\n }\n\n // Trim whitespace\n let sanitized = input.replace(/^\\s+|\\s+$/g, '');\n\n // Remove null bytes\n sanitized = sanitized.replace(/\\0/g, '');\n\n // Encode HTML entities to prevent XSS\n sanitized = sanitized.replace(/&/g, '&amp;').replace(/</g, '&lt;').replace(/>/g, '&gt;').replace(/\"/g, '&quot;').replace(/'/g, '&#x27;');\n\n // Truncate to max length\n if (sanitized.length > maxLength) {\n sanitized = sanitized.substring(0, maxLength);\n }\n\n return sanitized;\n}\n\n/**\n * Sanitize email input with email-specific rules\n * @param email The raw email input\n * @returns Sanitized email string\n */\nexport function sanitizeEmail(email: string): string {\n if (typeof email !== 'string') {\n return '';\n }\n\n // Trim and lowercase\n let sanitized = email.replace(/^\\s+|\\s+$/g, '').toLowerCase();\n\n // Remove null bytes and control characters\n sanitized = sanitized.replace(/[\\0\\x00-\\x1F\\x7F]/g, '');\n\n // Truncate to max email length (RFC 5321)\n if (sanitized.length > MAX_EMAIL_LENGTH) {\n sanitized = sanitized.substring(0, MAX_EMAIL_LENGTH);\n }\n\n return sanitized;\n}\n\n/**\n * Sanitize a value based on field type\n * @param value The raw value\n * @param inputType The type of input field\n * @returns Sanitized value\n */\nexport function sanitizeByType(value: string, inputType: string): string {\n switch (inputType) {\n case 'email':\n return sanitizeEmail(value);\n case 'number':\n // Only allow digits, decimal point, and minus sign\n const numStr = String(value).replace(/[^0-9.\\-]/g, '');\n return numStr.substring(0, 20); // Reasonable max for numbers\n case 'dropdown':\n case 'radio':\n // For select/radio, sanitize but be more permissive (values come from config)\n return sanitizeInput(value, 100);\n case 'checkbox':\n // Checkbox values are comma-separated, sanitize each\n return value\n .split(',')\n .map(v => sanitizeInput(v.replace(/^\\s+|\\s+$/g, ''), 100))\n .join(', ');\n default:\n return sanitizeInput(value);\n }\n}\n\n/**\n * Interface for respondent detail options\n */\ninterface RespondentDetailOption {\n value: string;\n label: string;\n}\n\n/**\n * Interface for respondent detail configuration\n */\ninterface RespondentDetail {\n label: string;\n value: string;\n inputType: string;\n required?: boolean;\n placeholder?: string;\n options?: RespondentDetailOption[];\n defaultValue?: any;\n}\n\n/**\n * Check if a survey key is valid UUID\n * @param key The survey key to validate\n * @returns True if the key is a valid UUID, false otherwise\n */\nexport function isValidKey(key: string | undefined | null): boolean {\n if (typeof key !== 'string' || key.trim().length === 0) {\n return false;\n }\n\n // UUID v4 regex pattern\n const uuidRegex = /^[0-9a-f]{8}-[0-9a-f]{4}-[1-5][0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$/i;\n return uuidRegex.test(key.trim());\n}\n\n/**\n * Format error messages for display\n * @param error The error object or message\n * @returns A formatted error message string\n */\nexport function formatErrorMessage(error: any): string {\n if (typeof error === 'string') {\n return error;\n }\n\n if (error instanceof Error) {\n return error.message;\n }\n\n return 'An unknown error occurred';\n}\n\n/**\n * Browser-compatible helper to check if array contains a value\n * @param array The array to search\n * @param value The value to find\n * @returns true if value is found in array\n */\nfunction arrayContains(array: string[], value: string): boolean {\n for (let i = 0; i < array.length; i++) {\n if (array[i] === value) {\n return true;\n }\n }\n return false;\n}\n\n/**\n * Browser-compatible helper to trim and split comma-separated values\n * @param value The comma-separated string\n * @returns Array of trimmed values\n */\nfunction parseCommaSeparatedValues(value: string): string[] {\n if (!value) {\n return [];\n }\n const parts = value.split(',');\n const result = [];\n for (let i = 0; i < parts.length; i++) {\n const trimmed = parts[i].replace(/^\\s+|\\s+$/g, ''); // Manual trim for IE compatibility\n if (trimmed) {\n result.push(trimmed);\n }\n }\n return result;\n}\n\n/**\n * Get field configuration for rendering\n * @param detail The respondent detail configuration\n * @param value The current value of the field\n * @returns Field configuration object\n */\nexport function getFieldConfig(detail: RespondentDetail, value: string) {\n const inputType = detail.inputType || 'text';\n const placeholder = detail.placeholder || 'Enter your ' + detail.label.toLowerCase();\n const required = detail.required !== false;\n\n return {\n inputType: inputType,\n placeholder: placeholder,\n required: required,\n options: detail.options || [],\n defaultValue: detail.defaultValue,\n hasOptions: detail.options && detail.options.length > 0,\n selectedValues: parseCommaSeparatedValues(value),\n fieldValue: detail.value,\n currentValue: value || '',\n };\n}\n\n/**\n * Browser-compatible helper to add value to comma-separated list\n * @param currentValue The current comma-separated string\n * @param valueToAdd The value to add\n * @returns Updated comma-separated string\n */\nexport function addToCommaSeparatedList(currentValue: string, valueToAdd: string): string {\n const values = parseCommaSeparatedValues(currentValue);\n if (!arrayContains(values, valueToAdd)) {\n values.push(valueToAdd);\n }\n return values.join(', ');\n}\n\n/**\n * Browser-compatible helper to remove value from comma-separated list\n * @param currentValue The current comma-separated string\n * @param valueToRemove The value to remove\n * @returns Updated comma-separated string\n */\nexport function removeFromCommaSeparatedList(currentValue: string, valueToRemove: string): string {\n const values = parseCommaSeparatedValues(currentValue);\n const result = [];\n for (let i = 0; i < values.length; i++) {\n if (values[i] !== valueToRemove) {\n result.push(values[i]);\n }\n }\n return result.join(', ');\n}\n"],"names":[],"mappings":"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"}