@modernpoacher/gremlins 0.0.311 → 1.0.1

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 (173) hide show
  1. package/.prettierignore +4 -0
  2. package/babel.config.cjs +4 -1
  3. package/eslint.config.mjs +33 -71
  4. package/index.d.mts +169 -2
  5. package/jest.after-each.mjs +10 -0
  6. package/jest.before-each.mjs +10 -0
  7. package/jest.config.mjs +11 -1
  8. package/package.json +84 -29
  9. package/src/{components → js/components}/common/disabled/index.cjs +5 -2
  10. package/src/js/components/common/disabled/index.d.cts +1 -0
  11. package/src/js/components/common/disabled/index.jsx +11 -0
  12. package/src/{components → js/components}/common/readonly/index.cjs +5 -2
  13. package/src/js/components/common/readonly/index.d.cts +1 -0
  14. package/src/js/components/common/readonly/index.jsx +11 -0
  15. package/src/{components → js/components}/common/required/index.cjs +5 -2
  16. package/src/js/components/common/required/index.d.cts +1 -0
  17. package/src/js/components/common/required/index.jsx +11 -0
  18. package/src/{components → js/components}/common/text-content/index.cjs +5 -2
  19. package/src/js/components/common/text-content/index.d.cts +2 -0
  20. package/src/{components → js/components}/common/text-content/index.d.mts +1 -3
  21. package/src/{components → js/components}/common/text-content/index.jsx +6 -5
  22. package/src/{components → js/components}/field/index.cjs +10 -2
  23. package/src/js/components/field/index.d.cts +1 -0
  24. package/src/js/components/field/index.d.mts +24 -0
  25. package/src/js/components/field/index.jsx +98 -0
  26. package/src/{components → js/components}/group/index.cjs +5 -2
  27. package/src/js/components/group/index.d.cts +2 -0
  28. package/src/js/components/group/index.d.mts +9 -0
  29. package/src/js/components/group/index.jsx +5 -0
  30. package/src/js/components/index.cjs +29 -0
  31. package/src/js/components/index.d.cts +2 -0
  32. package/src/js/components/index.d.mts +2 -0
  33. package/src/js/components/index.mjs +8 -0
  34. package/src/{gremlins → js/gremlins}/checkbox/field/index.cjs +5 -2
  35. package/src/js/gremlins/checkbox/field/index.d.cts +2 -0
  36. package/src/js/gremlins/checkbox/field/index.d.mts +14 -0
  37. package/src/{gremlins → js/gremlins}/checkbox/field/index.jsx +21 -10
  38. package/src/{gremlins → js/gremlins}/checkbox/index.cjs +5 -2
  39. package/src/js/gremlins/checkbox/index.d.cts +2 -0
  40. package/src/js/gremlins/checkbox/index.d.mts +24 -0
  41. package/src/{gremlins → js/gremlins}/checkbox/index.jsx +31 -23
  42. package/src/{gremlins → js/gremlins}/email/field/index.cjs +5 -2
  43. package/src/js/gremlins/email/field/index.d.cts +2 -0
  44. package/src/js/gremlins/email/field/index.d.mts +14 -0
  45. package/src/js/gremlins/email/field/index.jsx +83 -0
  46. package/src/{gremlins → js/gremlins}/email/index.cjs +5 -2
  47. package/src/js/gremlins/email/index.d.cts +2 -0
  48. package/src/js/gremlins/email/index.d.mts +18 -0
  49. package/src/{gremlins → js/gremlins}/email/index.jsx +25 -12
  50. package/src/{gremlins → js/gremlins}/fieldset/group/index.cjs +5 -2
  51. package/src/js/gremlins/fieldset/group/index.d.cts +2 -0
  52. package/src/js/gremlins/fieldset/group/index.d.mts +12 -0
  53. package/src/js/gremlins/fieldset/group/index.jsx +19 -0
  54. package/src/{gremlins → js/gremlins}/fieldset/index.cjs +5 -2
  55. package/src/js/gremlins/fieldset/index.d.cts +2 -0
  56. package/src/js/gremlins/fieldset/index.d.mts +14 -0
  57. package/src/js/gremlins/fieldset/index.jsx +37 -0
  58. package/src/{gremlins → js/gremlins}/index.cjs +9 -4
  59. package/src/js/gremlins/index.d.cts +5 -0
  60. package/src/js/gremlins/index.d.mts +27 -0
  61. package/src/js/gremlins/index.jsx +162 -0
  62. package/src/{gremlins → js/gremlins}/number/field/index.cjs +5 -2
  63. package/src/js/gremlins/number/field/index.d.cts +2 -0
  64. package/src/js/gremlins/number/field/index.d.mts +14 -0
  65. package/src/{gremlins → js/gremlins}/number/field/index.jsx +40 -7
  66. package/src/{gremlins → js/gremlins}/number/index.cjs +5 -2
  67. package/src/js/gremlins/number/index.d.cts +2 -0
  68. package/src/js/gremlins/number/index.d.mts +18 -0
  69. package/src/{gremlins → js/gremlins}/number/index.jsx +25 -8
  70. package/src/{gremlins → js/gremlins}/password/field/index.cjs +5 -2
  71. package/src/js/gremlins/password/field/index.d.cts +2 -0
  72. package/src/js/gremlins/password/field/index.d.mts +14 -0
  73. package/src/js/gremlins/password/field/index.jsx +83 -0
  74. package/src/{gremlins → js/gremlins}/password/index.cjs +5 -2
  75. package/src/js/gremlins/password/index.d.cts +2 -0
  76. package/src/js/gremlins/password/index.d.mts +18 -0
  77. package/src/{gremlins → js/gremlins}/password/index.jsx +25 -12
  78. package/src/{gremlins → js/gremlins}/radio/field/index.cjs +5 -2
  79. package/src/js/gremlins/radio/field/index.d.cts +2 -0
  80. package/src/js/gremlins/radio/field/index.d.mts +14 -0
  81. package/src/{gremlins → js/gremlins}/radio/field/index.jsx +20 -9
  82. package/src/{gremlins → js/gremlins}/radio/index.cjs +5 -2
  83. package/src/js/gremlins/radio/index.d.cts +2 -0
  84. package/src/js/gremlins/radio/index.d.mts +24 -0
  85. package/src/{gremlins → js/gremlins}/radio/index.jsx +33 -17
  86. package/src/{gremlins → js/gremlins}/select/field/index.cjs +5 -2
  87. package/src/js/gremlins/select/field/index.d.cts +2 -0
  88. package/src/js/gremlins/select/field/index.d.mts +18 -0
  89. package/src/js/gremlins/select/field/index.jsx +200 -0
  90. package/src/{gremlins → js/gremlins}/select/index.cjs +5 -2
  91. package/src/js/gremlins/select/index.d.cts +2 -0
  92. package/src/js/gremlins/select/index.d.mts +18 -0
  93. package/src/{gremlins → js/gremlins}/select/index.jsx +53 -16
  94. package/src/{gremlins → js/gremlins}/text/field/index.cjs +5 -2
  95. package/src/js/gremlins/text/field/index.d.cts +2 -0
  96. package/src/js/gremlins/text/field/index.d.mts +14 -0
  97. package/src/js/gremlins/text/field/index.jsx +83 -0
  98. package/src/{gremlins → js/gremlins}/text/index.cjs +5 -2
  99. package/src/js/gremlins/text/index.d.cts +2 -0
  100. package/src/js/gremlins/text/index.d.mts +18 -0
  101. package/src/{gremlins → js/gremlins}/text/index.jsx +25 -12
  102. package/src/{gremlins → js/gremlins}/textarea/field/index.cjs +5 -2
  103. package/src/js/gremlins/textarea/field/index.d.cts +2 -0
  104. package/src/js/gremlins/textarea/field/index.d.mts +18 -0
  105. package/src/js/gremlins/textarea/field/index.jsx +81 -0
  106. package/src/{gremlins → js/gremlins}/textarea/index.cjs +5 -2
  107. package/src/js/gremlins/textarea/index.d.cts +2 -0
  108. package/src/js/gremlins/textarea/index.d.mts +18 -0
  109. package/src/{gremlins → js/gremlins}/textarea/index.jsx +25 -12
  110. package/src/js/super/components/field/index.cjs +20 -0
  111. package/src/js/super/components/field/index.d.cts +2 -0
  112. package/src/js/super/components/field/index.d.mts +23 -0
  113. package/src/{components → js/super/components}/field/index.jsx +44 -87
  114. package/src/js/super/components/group/index.cjs +20 -0
  115. package/src/js/super/components/group/index.d.cts +2 -0
  116. package/src/js/super/components/group/index.d.mts +18 -0
  117. package/src/js/super/components/group/index.jsx +59 -0
  118. package/src/js/super/components/index.cjs +23 -0
  119. package/src/js/super/components/index.d.cts +2 -0
  120. package/src/js/super/components/index.d.mts +2 -0
  121. package/src/js/super/components/index.mjs +8 -0
  122. package/src/js/super/gremlins/index.cjs +22 -0
  123. package/src/js/super/gremlins/index.d.cts +4 -0
  124. package/src/js/super/gremlins/index.d.mts +36 -0
  125. package/src/js/super/gremlins/index.jsx +176 -0
  126. package/src/sass/.stylelintrc +14 -0
  127. package/src/sass/_gremlins.scss +59 -0
  128. package/src/sass/gremlins/_checkbox.scss +87 -0
  129. package/src/sass/gremlins/_disabled.scss +15 -0
  130. package/src/sass/gremlins/_error.scss +48 -0
  131. package/src/sass/gremlins/_radio.scss +93 -0
  132. package/.publish/README.md +0 -20
  133. package/src/common/index.d.mts +0 -9
  134. package/src/common/index.mjs +0 -7
  135. package/src/components/common/disabled/index.jsx +0 -9
  136. package/src/components/common/readonly/index.jsx +0 -9
  137. package/src/components/common/required/index.jsx +0 -9
  138. package/src/components/field/index.d.mts +0 -23
  139. package/src/components/group/index.d.mts +0 -16
  140. package/src/components/group/index.jsx +0 -59
  141. package/src/gremlins/checkbox/field/index.d.mts +0 -9
  142. package/src/gremlins/checkbox/index.d.mts +0 -9
  143. package/src/gremlins/email/field/index.d.mts +0 -9
  144. package/src/gremlins/email/field/index.jsx +0 -54
  145. package/src/gremlins/email/index.d.mts +0 -9
  146. package/src/gremlins/fieldset/group/index.d.mts +0 -9
  147. package/src/gremlins/fieldset/group/index.jsx +0 -16
  148. package/src/gremlins/fieldset/index.d.mts +0 -9
  149. package/src/gremlins/fieldset/index.jsx +0 -41
  150. package/src/gremlins/index.d.mts +0 -45
  151. package/src/gremlins/index.jsx +0 -291
  152. package/src/gremlins/number/field/index.d.mts +0 -9
  153. package/src/gremlins/number/index.d.mts +0 -9
  154. package/src/gremlins/password/field/index.d.mts +0 -9
  155. package/src/gremlins/password/field/index.jsx +0 -54
  156. package/src/gremlins/password/index.d.mts +0 -9
  157. package/src/gremlins/radio/field/index.d.mts +0 -9
  158. package/src/gremlins/radio/index.d.mts +0 -9
  159. package/src/gremlins/select/field/index.d.mts +0 -9
  160. package/src/gremlins/select/field/index.jsx +0 -111
  161. package/src/gremlins/select/index.d.mts +0 -9
  162. package/src/gremlins/text/field/index.d.mts +0 -9
  163. package/src/gremlins/text/field/index.jsx +0 -54
  164. package/src/gremlins/text/index.d.mts +0 -9
  165. package/src/gremlins/textarea/field/index.d.mts +0 -9
  166. package/src/gremlins/textarea/field/index.jsx +0 -53
  167. package/src/gremlins/textarea/index.d.mts +0 -9
  168. /package/src/{components → js/components}/common/disabled/index.d.mts +0 -0
  169. /package/src/{components → js/components}/common/readonly/index.d.mts +0 -0
  170. /package/src/{components → js/components}/common/required/index.d.mts +0 -0
  171. /package/src/{index.cjs → js/index.cjs} +0 -0
  172. /package/src/{index.d.mts → js/index.d.mts} +0 -0
  173. /package/src/{index.mjs → js/index.mjs} +0 -0
@@ -0,0 +1,4 @@
1
+ *.html
2
+ *.mjs
3
+ *.cjs
4
+ .stylelintrc
package/babel.config.cjs CHANGED
@@ -51,7 +51,10 @@ module.exports = (api) => {
51
51
  presets,
52
52
  plugins,
53
53
  ignore: [
54
- /node_modules\/(?!@modernpoacher\/cogs|@modernpoacher\/sprockets|@modernpoacher\/gremlins)/
54
+ /node_modules\/(?!@modernpoacher\/cogs|@modernpoacher\/sprockets|@modernpoacher\/gremlins)\//,
55
+ /node_modules\/(?!react-component-instance)\//,
56
+ /node_modules\/(?!react-component-snapshot)\//,
57
+ /node_modules\/(?!react-component-name)\//
55
58
  ]
56
59
  }
57
60
  }
package/eslint.config.mjs CHANGED
@@ -58,12 +58,11 @@ export default [
58
58
  ]
59
59
  },
60
60
  /**
61
- * React config for all `jsx` and `tsx` files
61
+ * React config for all `jsx` files
62
62
  */
63
63
  {
64
64
  ...reactPlugin.configs.flat.recommended,
65
65
  settings: {
66
- ...reactPlugin.configs.flat.recommended.settings,
67
66
  ...reactSettings
68
67
  }
69
68
  },
@@ -80,7 +79,9 @@ export default [
80
79
  ],
81
80
  ignores: [
82
81
  'src',
83
- 'stories'
82
+ 'stories',
83
+ 'test',
84
+ 'jest.*.mjs'
84
85
  ],
85
86
  languageOptions: {
86
87
  globals: {
@@ -99,16 +100,26 @@ export default [
99
100
  }
100
101
  }
101
102
  }),
103
+ standard({
104
+ files: [
105
+ 'test/**/*.{mjs,cjs,mts,cts}'
106
+ ],
107
+ languageOptions: {
108
+ globals: {
109
+ ...globals.mocha
110
+ }
111
+ }
112
+ }),
102
113
  /**
103
- * Standard config for all `jsx` and `tsx` files
114
+ * Standard config for all `jsx` files
104
115
  */
105
116
  standard({
106
117
  files: [
107
- 'src/**/*.tsx',
118
+ 'src/**/*.jsx',
108
119
  'stories/**/*.jsx'
109
120
  ],
110
121
  ignores: [
111
- 'src/**/__tests__/**/*.tsx',
122
+ 'src/**/__tests__/**/*.jsx',
112
123
  'stories/**/__tests__/**/*.jsx'
113
124
  ],
114
125
  languageOptions: {
@@ -120,25 +131,23 @@ export default [
120
131
  globals: {
121
132
  ...globals.browser
122
133
  }
123
- },
134
+ }, // @ts-expect-error Storybook
124
135
  plugins: {
125
136
  ...reactPlugins,
126
137
  ...storybookPlugins
127
- },
138
+ }, // @ts-expect-error Storybook
128
139
  rules: {
129
140
  ...reactRules
130
141
  },
131
142
  settings: {
132
- ...reactSettings,
133
- 'import/resolver': {
134
- 'babel-module': {}
135
- }
143
+ ...reactSettings
136
144
  }
137
145
  }),
138
146
  standard({
139
147
  files: [
140
- 'src/**/__tests__/**/*.tsx',
141
- 'stories/**/__tests__/**/*.jsx'
148
+ 'src/**/__tests__/**/*.jsx',
149
+ 'stories/**/__tests__/**/*.jsx',
150
+ 'jest.*.mjs'
142
151
  ],
143
152
  languageOptions: {
144
153
  parser: babelParser,
@@ -150,19 +159,16 @@ export default [
150
159
  ...globals.browser,
151
160
  ...globals.jest
152
161
  }
153
- },
162
+ }, // @ts-expect-error Storybook
154
163
  plugins: {
155
164
  ...reactPlugins,
156
165
  ...storybookPlugins
157
- },
166
+ }, // @ts-expect-error Storybook
158
167
  rules: {
159
168
  ...reactRules
160
169
  },
161
170
  settings: {
162
- ...reactSettings,
163
- 'import/resolver': {
164
- 'babel-module': {}
165
- }
171
+ ...reactSettings
166
172
  }
167
173
  }),
168
174
  /**
@@ -173,80 +179,36 @@ export default [
173
179
  '**/*.{mts,cts}'
174
180
  ],
175
181
  ignores: [
176
- 'src'
177
- ],
178
- languageOptions: {
179
- globals: {
180
- ...globals.node,
181
- GremlinsTypes: 'readonly'
182
- }
183
- }
184
- }),
185
- typescript({
186
- files: [
187
- 'src/**/*.{mts,cts}'
188
- ],
189
- languageOptions: {
190
- globals: {
191
- ...globals.browser
192
- }
193
- }
194
- }),
195
- /**
196
- * TypeScript config for only `tsx` files
197
- */
198
- typescript({
199
- files: [
200
- 'src/**/*.tsx'
201
- ],
202
- ignores: [
203
- 'src/**/__tests__/**/*.tsx'
182
+ 'src',
183
+ 'test'
204
184
  ],
205
185
  languageOptions: {
206
186
  parser: typescriptParser,
207
187
  parserOptions: {
208
- ...reactParserOptions,
209
188
  projectService: true,
210
189
  project: 'tsconfig.json'
211
190
  },
212
191
  globals: {
213
- ...globals.browser
192
+ ...globals.node,
193
+ GremlinsTypes: 'readonly'
214
194
  }
215
- },
216
- plugins: {
217
- ...reactPlugins
218
- },
219
- rules: {
220
- ...reactRules
221
- },
222
- settings: {
223
- ...reactSettings
224
195
  }
225
196
  }),
226
197
  typescript({
227
198
  files: [
228
- 'src/**/__tests__/**/*.tsx'
199
+ 'src/**/*.{mts,cts}',
200
+ 'test/**/*.{mts,cts}'
229
201
  ],
230
202
  languageOptions: {
231
203
  parser: typescriptParser,
232
204
  parserOptions: {
233
- ...reactParserOptions,
234
205
  projectService: true,
235
206
  project: 'tsconfig.json'
236
207
  },
237
208
  globals: {
238
209
  ...globals.browser,
239
- ...globals.jest
210
+ GremlinsTypes: 'readonly'
240
211
  }
241
- },
242
- plugins: {
243
- ...reactPlugins
244
- },
245
- rules: {
246
- ...reactRules
247
- },
248
- settings: {
249
- ...reactSettings
250
212
  }
251
213
  })
252
214
  ]
package/index.d.mts CHANGED
@@ -1,8 +1,175 @@
1
+ import type React from 'react'
2
+
1
3
  declare global {
2
4
  namespace GremlinsTypes {
3
- export type OnChangeType = () => void
5
+ export type OnEventType = (
6
+ value?: string | string[],
7
+ checked?: boolean
8
+ ) => void
9
+
10
+ export interface FieldErrorType {
11
+ text: string
12
+ href: string
13
+ }
14
+
15
+ export namespace Super {
16
+ export namespace Gremlins {
17
+ export interface FieldGremlinProps {
18
+ id?: string
19
+ name: string
20
+ value?: string
21
+ required?: boolean
22
+ disabled?: boolean
23
+ readOnly?: boolean
24
+ tabIndex?: number
25
+ accessKey?: string
26
+ placeholder?: string
27
+ onChange?: OnEventType
28
+ fieldRef?: React.RefObject<any> // eslint-disable-line @typescript-eslint/no-explicit-any -- Simplicity
29
+ }
30
+
31
+ export type FieldGremlinState = Record<PropertyKey, unknown>
32
+
33
+ export interface GroupGremlinProps extends React.PropsWithChildren {
34
+ groupRef?: React.RefObject<any> // eslint-disable-line @typescript-eslint/no-explicit-any -- Simplicity
35
+ }
36
+
37
+ export type GroupGremlinState = Record<PropertyKey, unknown>
38
+ }
39
+
40
+ export namespace Components {
41
+ export namespace Field {
42
+ export type FieldProps = Gremlins.FieldGremlinProps
43
+
44
+ export type FieldState = Gremlins.FieldGremlinState
45
+ }
46
+
47
+ export namespace Group {
48
+ export type GroupProps = Gremlins.GroupGremlinProps
49
+
50
+ export type GroupState = Gremlins.GroupGremlinState
51
+ }
52
+ }
53
+ }
54
+
55
+ export namespace Components {
56
+ export namespace Common {
57
+ export namespace TextContent {
58
+ export interface TextContentProps {
59
+ textContent?: string
60
+ }
61
+ }
62
+ }
63
+
64
+ export namespace Field {
65
+ export interface ValueProps extends Super.Components.Field.FieldProps {
66
+ defaultValue?: string
67
+ }
68
+
69
+ export interface CheckProps extends Super.Components.Field.FieldProps {
70
+ checked?: boolean
71
+ defaultChecked?: boolean
72
+ onClick?: OnEventType
73
+ }
74
+
75
+ export namespace Checkbox {
76
+ export type CheckboxProps = CheckProps
77
+ }
78
+
79
+ export namespace Email {
80
+ export type EmailProps = ValueProps
81
+ }
82
+
83
+ export namespace Number {
84
+ export type NumberProps = ValueProps
85
+ }
86
+
87
+ export namespace Password {
88
+ export type PasswordProps = ValueProps
89
+ }
90
+
91
+ export namespace Radio {
92
+ export type RadioProps = CheckProps
93
+ }
94
+
95
+ export namespace Select {
96
+ export interface SelectProps extends ValueProps, React.PropsWithChildren {
97
+ multiple?: boolean
98
+ }
99
+ }
100
+
101
+ export namespace Text {
102
+ export type TextProps = ValueProps
103
+ }
104
+
105
+ export namespace Textarea {
106
+ export type TextareaProps = ValueProps
107
+ }
108
+ }
109
+
110
+ export namespace Group {
111
+ export type GroupProps = Super.Components.Group.GroupProps
112
+
113
+ export type FieldsetProps = GroupProps
114
+ }
115
+ }
116
+
117
+ export namespace Gremlins {
118
+ export interface ValueProps extends Super.Gremlins.FieldGremlinProps {
119
+ defaultValue?: string
120
+ }
121
+
122
+ export interface CheckProps extends Super.Gremlins.FieldGremlinProps {
123
+ checked?: boolean
124
+ defaultChecked?: boolean
125
+ onClick?: OnEventType
126
+ }
127
+
128
+ export type GroupProps = Super.Gremlins.GroupGremlinProps
129
+
130
+ export namespace Checkbox {
131
+ export type CheckboxProps = CheckProps
132
+ }
133
+
134
+ export namespace Email {
135
+ export type EmailProps = ValueProps
136
+ }
137
+
138
+ export namespace Number {
139
+ export interface NumberProps extends Omit<Omit<ValueProps, 'value'>, 'defaultValue'> {
140
+ value?: string | number
141
+ defaultValue?: string | number
142
+ }
143
+ }
144
+
145
+ export namespace Password {
146
+ export type PasswordProps = ValueProps
147
+ }
148
+
149
+ export namespace Radio {
150
+ export type RadioProps = CheckProps
151
+ }
152
+
153
+ export namespace Select {
154
+ export interface SelectProps extends Omit<Omit<ValueProps, 'value'>, 'defaultValue'>, React.PropsWithChildren {
155
+ value?: string | string[]
156
+ defaultValue?: string | string[]
157
+ multiple?: boolean
158
+ }
159
+ }
160
+
161
+ export namespace Text {
162
+ export type TextProps = ValueProps
163
+ }
164
+
165
+ export namespace Textarea {
166
+ export type TextareaProps = ValueProps
167
+ }
4
168
 
5
- export type OnClickType = () => void
169
+ export namespace Fieldset {
170
+ export type FieldsetProps = GroupProps
171
+ }
172
+ }
6
173
  }
7
174
  }
8
175
 
@@ -0,0 +1,10 @@
1
+ afterEach(() => {
2
+ const {
3
+ body
4
+ } = document
5
+
6
+ Array.from(body.children)
7
+ .forEach((child) => {
8
+ body.removeChild(child)
9
+ })
10
+ })
@@ -0,0 +1,10 @@
1
+ beforeEach(() => {
2
+ const {
3
+ body
4
+ } = document
5
+
6
+ Array.from(body.children)
7
+ .forEach((child) => {
8
+ body.removeChild(child)
9
+ })
10
+ })
package/jest.config.mjs CHANGED
@@ -14,5 +14,15 @@ export default {
14
14
  '^.+\\.jsx$': 'babel-jest',
15
15
  '^.+\\.mjs$': 'babel-jest'
16
16
  },
17
- moduleFileExtensions: ['js', 'jsx', 'mjs']
17
+ transformIgnorePatterns: [
18
+ '/node_modules\\/(?!react-component-instance)\\/',
19
+ '/node_modules\\/(?!react-component-snapshot)\\/',
20
+ '/node_modules\\/(?!react-component-name)\\/'
21
+ ],
22
+ moduleFileExtensions: ['js', 'jsx', 'mjs'],
23
+ testEnvironment: 'jsdom',
24
+ setupFilesAfterEnv: [
25
+ '<rootDir>/jest.before-each.mjs',
26
+ '<rootDir>/jest.after-each.mjs'
27
+ ]
18
28
  }
package/package.json CHANGED
@@ -1,12 +1,12 @@
1
1
  {
2
2
  "name": "@modernpoacher/gremlins",
3
- "version": "0.0.311",
3
+ "version": "1.0.1",
4
4
  "description": "Gremlins",
5
5
  "keywords": [
6
6
  "Gremlins",
7
7
  "React"
8
8
  ],
9
- "main": "./src/index.cjs",
9
+ "main": "./src/js/index.mjs",
10
10
  "type": "module",
11
11
  "types": "./index.d.mts",
12
12
  "author": {
@@ -23,20 +23,27 @@
23
23
  "url": "git+ssh://git@github.com/modernpoacher/gremlins.git"
24
24
  },
25
25
  "scripts": {
26
- "build": "cross-env DEBUG=@modernpoacher/gremlins* webpack",
26
+ "build": "cross-env DEBUG=@modernpoacher/gremlins* webpack -c .storybook/webpack.config.mjs",
27
27
  "build-storybook": "storybook build",
28
- "build:watch": "cross-env DEBUG=@modernpoacher/gremlins* webpack --watch",
29
- "lint": "eslint",
30
- "lint:fix": "npm run lint -- --fix",
28
+ "build:watch": "npm run build -- -w",
29
+ "lint": "npm run lint:js && npm run lint:sass",
30
+ "lint:fix": "npm run lint:js:fix && npm run lint:sass:fix",
31
+ "lint:js": "eslint",
32
+ "lint:js:fix": "npm run lint:js -- --fix",
33
+ "lint:sass": "stylelint src/sass .storybook/*.scss",
34
+ "lint:sass:fix": "npm run lint:sass -- --fix",
31
35
  "nvm": "bash nvm.sh",
32
36
  "prebuild": "npm run nvm",
33
37
  "prelint": "npm run nvm",
34
38
  "prepare": "husky",
35
- "prestorybook": "npm run build && npm run transform",
39
+ "prestorybook": "npm run build && npm run prettier && npm run transform",
36
40
  "pretest": "npm run nvm",
41
+ "prettier": "prettier src/sass .storybook --write",
37
42
  "storybook": "storybook dev -p 6008",
38
- "test": "cross-env NODE_ENV=test jest",
39
- "transform": "cross-env DEBUG=@modernpoacher/gremlins* ./transform.sh"
43
+ "test": "npm run test:mocha && npm run test:jest",
44
+ "test:jest": "cross-env NODE_ENV=test jest",
45
+ "test:mocha": "cross-env NODE_ENV=test mocha test --recursive",
46
+ "transform": "cross-env DEBUG=@modernpoacher/gremlins* .storybook/transform.sh"
40
47
  },
41
48
  "dependencies": {
42
49
  "classnames": "^2.5.1",
@@ -49,8 +56,8 @@
49
56
  "@babel/preset-react": "^7.26.3",
50
57
  "@babel/register": "^7.25.9",
51
58
  "@modernpoacher/design-system": "1.2.0",
52
- "@sequencemedia/eslint-config-standard": "^0.2.46",
53
- "@sequencemedia/eslint-config-typescript": "^0.1.67",
59
+ "@sequencemedia/eslint-config-standard": "^0.2.47",
60
+ "@sequencemedia/eslint-config-typescript": "^0.1.69",
54
61
  "@storybook/addon-actions": "^8.6.10",
55
62
  "@storybook/addon-essentials": "^8.6.10",
56
63
  "@storybook/addon-links": "^8.6.10",
@@ -58,22 +65,33 @@
58
65
  "@storybook/manager-api": "^8.6.10",
59
66
  "@storybook/react": "^8.6.10",
60
67
  "@storybook/react-webpack5": "^8.6.10",
68
+ "@storybook/test": "^8.6.10",
61
69
  "@storybook/theming": "^8.6.10",
62
- "@types/react": "18.3.13",
70
+ "@testing-library/jest-dom": "^6.6.3",
71
+ "@testing-library/react": "^16.2.0",
72
+ "@types/babel__register": "^7.17.3",
73
+ "@types/chai": "^5.2.1",
74
+ "@types/debug": "^4.1.12",
75
+ "@types/jest": "^29.5.14",
76
+ "@types/mocha": "^10.0.10",
77
+ "@types/prop-types": "^15.7.14",
78
+ "@types/react": "^19.0.12",
79
+ "@types/react-dom": "^19.0.4",
63
80
  "@typescript-eslint/eslint-plugin": "^8.28.0",
64
81
  "@typescript-eslint/parser": "^8.28.0",
65
82
  "autoprefixer": "^10.4.21",
66
- "clean-webpack-plugin": "^4.0.0",
83
+ "chai": "^5.2.0",
67
84
  "core-js": "^3.41.0",
68
85
  "cross-env": "^7.0.3",
69
86
  "eslint": "^9.23.0",
70
- "eslint-import-resolver-babel-module": "^5.3.2",
71
87
  "eslint-plugin-react": "^7.37.4",
72
88
  "eslint-plugin-storybook": "^0.12.0",
73
89
  "globals": "^16.0.0",
74
90
  "husky": "^9.1.7",
75
91
  "jest": "^29.7.0",
92
+ "jest-environment-jsdom": "^29.7.0",
76
93
  "mini-css-extract-plugin": "^2.9.2",
94
+ "mocha": "^11.1.0",
77
95
  "perfectionist": "^2.4.0",
78
96
  "postcss": "^8.5.3",
79
97
  "postcss-discard-comments": "^7.0.3",
@@ -81,35 +99,72 @@
81
99
  "postcss-import": "^16.1.0",
82
100
  "postcss-loader": "^8.1.1",
83
101
  "postcss-map": "^0.11.0",
102
+ "prettier": "^3.5.3",
84
103
  "prop-types": "^15.8.1",
85
- "react": "18.3.1",
86
- "react-dom": "18.3.1",
87
- "react-test-renderer": "18.3.1",
104
+ "react": "^19.0.0",
105
+ "react-component-instance": "^0.0.16",
106
+ "react-component-snapshot": "^0.0.16",
107
+ "react-dom": "^19.0.0",
88
108
  "remove-files-webpack-plugin": "^1.5.0",
89
109
  "sass": "^1.86.0",
90
110
  "sass-loader": "^16.0.5",
91
111
  "storybook": "^8.6.10",
112
+ "stylelint": "^16.17.0",
113
+ "stylelint-config-recommended-scss": "^14.1.0",
114
+ "stylelint-scss": "^6.11.1",
92
115
  "webpack": "^5.98.0",
93
116
  "webpack-cli": "^6.0.1"
94
117
  },
95
118
  "imports": {
96
- "#build/paths": "./build/paths.mjs",
97
- "#gremlins/common": "./src/common/index.mjs",
98
- "#gremlins/components/*": "./src/components/*/index.jsx",
99
- "#gremlins/gremlins": "./src/gremlins/index.jsx",
100
- "#gremlins/gremlins/*": "./src/gremlins/*/index.jsx",
101
- "#stories/*": "./stories/*/index.stories.jsx",
119
+ "#gremlins": {
120
+ "require": "./src/js/index.cjs",
121
+ "import": "./src/js/index.mjs"
122
+ },
123
+ "#gremlins/components": {
124
+ "require": "./src/js/components/index.cjs",
125
+ "import": "./src/js/components/index.mjs"
126
+ },
127
+ "#gremlins/components/*": "./src/js/components/*/index.cjs",
128
+ "#gremlins/gremlins": "./src/js/gremlins/index.cjs",
129
+ "#gremlins/gremlins/*": "./src/js/gremlins/*/index.cjs",
130
+ "#gremlins/super": {
131
+ "require": "./src/js/super/index.cjs",
132
+ "import": "./src/js/super/index.mjs"
133
+ },
134
+ "#gremlins/super/components": {
135
+ "require": "./src/js/super/components/index.cjs",
136
+ "import": "./src/js/super/components/index.mjs"
137
+ },
138
+ "#gremlins/super/components/*": "./src/js/super/components/*/index.cjs",
139
+ "#gremlins/super/gremlins": "./src/js/super/gremlins/index.cjs",
140
+ "#gremlins/super/gremlins/*": "./src/js/super/gremlins/*/index.cjs",
141
+ "#stories/errors": "./stories/errors.mjs",
142
+ "#stories/gremlins/*": "./stories/cogs/gremlins/index.stories.jsx",
102
143
  "#stories/state": "./stories/state/index.jsx",
103
144
  "#stories/state/*": "./stories/state/*/index.jsx"
104
145
  },
105
146
  "exports": {
106
147
  ".": {
107
- "require": "./src/index.cjs",
108
- "import": "./src/index.mjs"
148
+ "require": "./src/js/index.cjs",
149
+ "import": "./src/js/index.mjs"
150
+ },
151
+ "./components": {
152
+ "require": "./src/js/components/index.cjs",
153
+ "import": "./src/js/components/index.mjs"
154
+ },
155
+ "./components/*": "./src/js/components/*/index.cjs",
156
+ "./gremlins": "./src/js/gremlins/index.cjs",
157
+ "./gremlins/*": "./src/js/gremlins/*/index.cjs",
158
+ "./super": {
159
+ "require": "./src/js/super/index.cjs",
160
+ "import": "./src/js/super/index.mjs"
161
+ },
162
+ "./super/components": {
163
+ "require": "./src/js/super/components/index.cjs",
164
+ "import": "./src/js/super/components/index.mjs"
109
165
  },
110
- "./common": "./src/common/index.mjs",
111
- "./components/*": "./src/components/*/index.cjs",
112
- "./gremlins": "./src/gremlins/index.cjs",
113
- "./gremlins/*": "./src/gremlins/*/index.cjs"
166
+ "./super/components/*": "./src/js/super/components/*/index.cjs",
167
+ "./super/gremlins": "./src/js/super/gremlins/index.cjs",
168
+ "./super/gremlins/*": "./src/js/super/gremlins/*/index.cjs"
114
169
  }
115
170
  }
@@ -11,7 +11,10 @@ const log = debug('@modernpoacher/gremlins/components/common/disabled')
11
11
  log('`gremlins` is awake')
12
12
 
13
13
  const {
14
- default: component
14
+ default: Disabled
15
15
  } = require('./index.jsx')
16
16
 
17
- module.exports = component
17
+ /**
18
+ * Exports only default
19
+ */
20
+ module.exports = Disabled
@@ -0,0 +1 @@
1
+ export { default } from '#gremlins/components/common/disabled'
@@ -0,0 +1,11 @@
1
+ import React from 'react'
2
+
3
+ const DISABLED = String.fromCharCode(42)
4
+
5
+ export default function Disabled () {
6
+ return (
7
+ <span className='is-disabled'>
8
+ {DISABLED}
9
+ </span>
10
+ )
11
+ }
@@ -11,7 +11,10 @@ const log = debug('@modernpoacher/gremlins/components/common/readonly')
11
11
  log('`gremlins` is awake')
12
12
 
13
13
  const {
14
- default: component
14
+ default: ReadOnly
15
15
  } = require('./index.jsx')
16
16
 
17
- module.exports = component
17
+ /**
18
+ * Exports only default
19
+ */
20
+ module.exports = ReadOnly
@@ -0,0 +1 @@
1
+ export { default } from '#gremlins/components/common/readonly'
@@ -0,0 +1,11 @@
1
+ import React from 'react'
2
+
3
+ const READONLY = String.fromCharCode(42)
4
+
5
+ export default function ReadOnly () {
6
+ return (
7
+ <span className='is-readonly'>
8
+ {READONLY}
9
+ </span>
10
+ )
11
+ }