@atlaskit/popup 1.17.2 → 1.19.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.
@@ -1,261 +1,256 @@
1
1
  import { type NodePath } from 'ast-types/lib/node-path';
2
2
  import {
3
- type ASTPath,
4
- type default as core,
5
- type ImportDeclaration,
6
- type JSXAttribute,
7
- type JSXElement,
8
- type Node,
3
+ type ASTPath,
4
+ type default as core,
5
+ type ImportDeclaration,
6
+ type JSXAttribute,
7
+ type JSXElement,
8
+ type Node,
9
9
  } from 'jscodeshift';
10
10
  import { type Collection } from 'jscodeshift/src/Collection';
11
11
 
12
12
  export type Nullable<T> = T | null;
13
13
 
14
14
  export function hasImportDeclaration(
15
- j: core.JSCodeshift,
16
- source: string,
17
- importPath: string,
15
+ j: core.JSCodeshift,
16
+ source: string,
17
+ importPath: string,
18
18
  ): boolean {
19
- return (
20
- j(source)
21
- .find(j.ImportDeclaration)
22
- .filter(
23
- (path: ASTPath<ImportDeclaration>) =>
24
- path.node.source.value === importPath,
25
- ).length > 0
26
- );
19
+ return (
20
+ j(source)
21
+ .find(j.ImportDeclaration)
22
+ .filter((path: ASTPath<ImportDeclaration>) => path.node.source.value === importPath).length >
23
+ 0
24
+ );
27
25
  }
28
26
 
29
27
  export function getDefaultSpecifierName({
30
- j,
31
- base,
32
- packageName,
28
+ j,
29
+ base,
30
+ packageName,
33
31
  }: {
34
- j: core.JSCodeshift;
35
- base: Collection<any>;
36
- packageName: string;
32
+ j: core.JSCodeshift;
33
+ base: Collection<any>;
34
+ packageName: string;
37
35
  }): Nullable<string> {
38
- const specifiers = base
39
- .find(j.ImportDeclaration)
40
- .filter((path) => path.node.source.value === packageName)
41
- .find(j.ImportDefaultSpecifier);
36
+ const specifiers = base
37
+ .find(j.ImportDeclaration)
38
+ .filter((path) => path.node.source.value === packageName)
39
+ .find(j.ImportDefaultSpecifier);
42
40
 
43
- if (!specifiers.length) {
44
- return null;
45
- }
46
- return specifiers.nodes()[0]!.local!.name;
41
+ if (!specifiers.length) {
42
+ return null;
43
+ }
44
+ return specifiers.nodes()[0]!.local!.name;
47
45
  }
48
46
 
49
47
  export function getSpecifierName({
50
- j,
51
- base,
52
- packageName,
53
- component,
48
+ j,
49
+ base,
50
+ packageName,
51
+ component,
54
52
  }: {
55
- j: core.JSCodeshift;
56
- base: Collection<any>;
57
- packageName: string;
58
- component: string;
53
+ j: core.JSCodeshift;
54
+ base: Collection<any>;
55
+ packageName: string;
56
+ component: string;
59
57
  }): Nullable<string> {
60
- const specifiers = base
61
- .find(j.ImportDeclaration)
62
- .filter((path) => path.node.source.value === packageName)
63
- .find(j.ImportSpecifier);
58
+ const specifiers = base
59
+ .find(j.ImportDeclaration)
60
+ .filter((path) => path.node.source.value === packageName)
61
+ .find(j.ImportSpecifier);
64
62
 
65
- if (!specifiers.length) {
66
- return null;
67
- }
68
- const specifierNode = specifiers
69
- .nodes()
70
- .find((node) => node.imported.name === component);
71
- if (!specifierNode) {
72
- return null;
73
- }
74
- // @ts-ignore
75
- return specifierNode.local.name;
63
+ if (!specifiers.length) {
64
+ return null;
65
+ }
66
+ const specifierNode = specifiers.nodes().find((node) => node.imported.name === component);
67
+ if (!specifierNode) {
68
+ return null;
69
+ }
70
+ // @ts-ignore
71
+ return specifierNode.local.name;
76
72
  }
77
73
 
78
74
  export function getJSXAttributesByName({
79
- j,
80
- element,
81
- attributeName,
75
+ j,
76
+ element,
77
+ attributeName,
82
78
  }: {
83
- j: core.JSCodeshift;
84
- element: JSXElement | ASTPath<JSXElement>;
85
- attributeName: string;
79
+ j: core.JSCodeshift;
80
+ element: JSXElement | ASTPath<JSXElement>;
81
+ attributeName: string;
86
82
  }): Collection<JSXAttribute> {
87
- return j(element)
88
- .find(j.JSXOpeningElement)
89
- .find(j.JSXAttribute)
90
- .filter((attribute) => {
91
- const matches = j(attribute)
92
- .find(j.JSXIdentifier)
93
- .filter((identifier) => identifier.value.name === attributeName);
94
- return Boolean(matches.length);
95
- });
83
+ return j(element)
84
+ .find(j.JSXOpeningElement)
85
+ .find(j.JSXAttribute)
86
+ .filter((attribute) => {
87
+ const matches = j(attribute)
88
+ .find(j.JSXIdentifier)
89
+ .filter((identifier) => identifier.value.name === attributeName);
90
+ return Boolean(matches.length);
91
+ });
96
92
  }
97
93
 
98
94
  export function hasJSXAttributesByName({
99
- j,
100
- element,
101
- attributeName,
95
+ j,
96
+ element,
97
+ attributeName,
102
98
  }: {
103
- j: core.JSCodeshift;
104
- element: JSXElement;
105
- attributeName: string;
99
+ j: core.JSCodeshift;
100
+ element: JSXElement;
101
+ attributeName: string;
106
102
  }): boolean {
107
- return getJSXAttributesByName({ j, element, attributeName }).length > 0;
103
+ return getJSXAttributesByName({ j, element, attributeName }).length > 0;
108
104
  }
109
105
 
110
106
  export function isUsingSupportedSpread({
111
- j,
112
- base,
113
- element,
107
+ j,
108
+ base,
109
+ element,
114
110
  }: {
115
- j: core.JSCodeshift;
116
- base: Collection<any>;
117
- element: NodePath<JSXElement, JSXElement>;
111
+ j: core.JSCodeshift;
112
+ base: Collection<any>;
113
+ element: NodePath<JSXElement, JSXElement>;
118
114
  }): boolean {
119
- const isUsingSpread: boolean =
120
- j(element).find(j.JSXSpreadAttribute).length > 0;
115
+ const isUsingSpread: boolean = j(element).find(j.JSXSpreadAttribute).length > 0;
121
116
 
122
- if (!isUsingSpread) {
123
- return true;
124
- }
117
+ if (!isUsingSpread) {
118
+ return true;
119
+ }
125
120
 
126
- return (
127
- j(element)
128
- .find(j.JSXSpreadAttribute)
129
- .filter((spread) => {
130
- const argument = spread.value.argument;
131
- // in place expression is supported
132
- if (argument.type === 'ObjectExpression') {
133
- return true;
134
- }
121
+ return (
122
+ j(element)
123
+ .find(j.JSXSpreadAttribute)
124
+ .filter((spread) => {
125
+ const argument = spread.value.argument;
126
+ // in place expression is supported
127
+ if (argument.type === 'ObjectExpression') {
128
+ return true;
129
+ }
135
130
 
136
- // Supporting identifiers that point to an a local object expression
137
- if (argument.type === 'Identifier') {
138
- return (
139
- base.find(j.VariableDeclarator).filter((declarator): boolean => {
140
- return (
141
- declarator.value.id.type === 'Identifier' &&
142
- // @ts-ignore
143
- declarator.value.init.type === 'ObjectExpression'
144
- );
145
- }).length > 0
146
- );
147
- }
131
+ // Supporting identifiers that point to an a local object expression
132
+ if (argument.type === 'Identifier') {
133
+ return (
134
+ base.find(j.VariableDeclarator).filter((declarator): boolean => {
135
+ return (
136
+ declarator.value.id.type === 'Identifier' &&
137
+ // @ts-ignore
138
+ declarator.value.init.type === 'ObjectExpression'
139
+ );
140
+ }).length > 0
141
+ );
142
+ }
148
143
 
149
- // We don't support anything else
150
- return false;
151
- }).length > 0
152
- );
144
+ // We don't support anything else
145
+ return false;
146
+ }).length > 0
147
+ );
153
148
  }
154
149
 
155
150
  export function isUsingThroughSpread({
156
- j,
157
- base,
158
- element,
159
- propName,
151
+ j,
152
+ base,
153
+ element,
154
+ propName,
160
155
  }: {
161
- j: core.JSCodeshift;
162
- base: Collection<any>;
163
- element: NodePath<JSXElement, JSXElement>;
164
- propName: string;
156
+ j: core.JSCodeshift;
157
+ base: Collection<any>;
158
+ element: NodePath<JSXElement, JSXElement>;
159
+ propName: string;
165
160
  }): boolean {
166
- if (!isUsingSupportedSpread({ j, base, element })) {
167
- return false;
168
- }
161
+ if (!isUsingSupportedSpread({ j, base, element })) {
162
+ return false;
163
+ }
169
164
 
170
- const isUsedThroughExpression: boolean =
171
- j(element)
172
- .find(j.JSXSpreadAttribute)
173
- .find(j.ObjectExpression)
174
- .filter((item) => {
175
- const match: boolean =
176
- item.value.properties.filter(
177
- (property) =>
178
- property.type === 'ObjectProperty' &&
179
- property.key.type === 'Identifier' &&
180
- property.key.name === propName,
181
- ).length > 0;
165
+ const isUsedThroughExpression: boolean =
166
+ j(element)
167
+ .find(j.JSXSpreadAttribute)
168
+ .find(j.ObjectExpression)
169
+ .filter((item) => {
170
+ const match: boolean =
171
+ item.value.properties.filter(
172
+ (property) =>
173
+ property.type === 'ObjectProperty' &&
174
+ property.key.type === 'Identifier' &&
175
+ property.key.name === propName,
176
+ ).length > 0;
182
177
 
183
- return match;
184
- }).length > 0;
178
+ return match;
179
+ }).length > 0;
185
180
 
186
- if (isUsedThroughExpression) {
187
- return true;
188
- }
181
+ if (isUsedThroughExpression) {
182
+ return true;
183
+ }
189
184
 
190
- const isUsedThroughIdentifier: boolean =
191
- j(element)
192
- .find(j.JSXSpreadAttribute)
193
- .find(j.Identifier)
194
- .filter((identifier): boolean => {
195
- return (
196
- base
197
- .find(j.VariableDeclarator)
198
- .filter(
199
- (declarator) =>
200
- declarator.value.id.type === 'Identifier' &&
201
- declarator.value.id.name === identifier.value.name,
202
- )
203
- .filter((declarator) => {
204
- const value = declarator.value;
205
- if (value.id.type !== 'Identifier') {
206
- return false;
207
- }
185
+ const isUsedThroughIdentifier: boolean =
186
+ j(element)
187
+ .find(j.JSXSpreadAttribute)
188
+ .find(j.Identifier)
189
+ .filter((identifier): boolean => {
190
+ return (
191
+ base
192
+ .find(j.VariableDeclarator)
193
+ .filter(
194
+ (declarator) =>
195
+ declarator.value.id.type === 'Identifier' &&
196
+ declarator.value.id.name === identifier.value.name,
197
+ )
198
+ .filter((declarator) => {
199
+ const value = declarator.value;
200
+ if (value.id.type !== 'Identifier') {
201
+ return false;
202
+ }
208
203
 
209
- if (value.id.name !== identifier.value.name) {
210
- return false;
211
- }
212
- // @ts-ignore
213
- if (value.init.type !== 'ObjectExpression') {
214
- return false;
215
- }
204
+ if (value.id.name !== identifier.value.name) {
205
+ return false;
206
+ }
207
+ // @ts-ignore
208
+ if (value.init.type !== 'ObjectExpression') {
209
+ return false;
210
+ }
216
211
 
217
- const match: boolean =
218
- // @ts-ignore
219
- value.init.properties.filter(
220
- // @ts-ignore
221
- (property) =>
222
- property.type === 'ObjectProperty' &&
223
- property.key.type === 'Identifier' &&
224
- property.key.name === propName,
225
- ).length > 0;
212
+ const match: boolean =
213
+ // @ts-ignore
214
+ value.init.properties.filter(
215
+ // @ts-ignore
216
+ (property) =>
217
+ property.type === 'ObjectProperty' &&
218
+ property.key.type === 'Identifier' &&
219
+ property.key.name === propName,
220
+ ).length > 0;
226
221
 
227
- return match;
228
- }).length > 0
229
- );
230
- }).length > 0;
222
+ return match;
223
+ }).length > 0
224
+ );
225
+ }).length > 0;
231
226
 
232
- return isUsedThroughIdentifier;
227
+ return isUsedThroughIdentifier;
233
228
  }
234
229
 
235
230
  export function isUsingProp({
236
- j,
237
- base,
238
- element,
239
- propName,
231
+ j,
232
+ base,
233
+ element,
234
+ propName,
240
235
  }: {
241
- j: core.JSCodeshift;
242
- base: Collection<any>;
243
- element: NodePath<JSXElement, JSXElement>;
244
- propName: string;
236
+ j: core.JSCodeshift;
237
+ base: Collection<any>;
238
+ element: NodePath<JSXElement, JSXElement>;
239
+ propName: string;
245
240
  }): boolean {
246
- return (
247
- hasJSXAttributesByName({
248
- j,
249
- element: element.value,
250
- attributeName: propName,
251
- }) ||
252
- isUsingThroughSpread({
253
- j,
254
- base,
255
- element,
256
- propName,
257
- })
258
- );
241
+ return (
242
+ hasJSXAttributesByName({
243
+ j,
244
+ element: element.value,
245
+ attributeName: propName,
246
+ }) ||
247
+ isUsingThroughSpread({
248
+ j,
249
+ base,
250
+ element,
251
+ propName,
252
+ })
253
+ );
259
254
  }
260
255
 
261
256
  // not replacing newlines (which \s does)
@@ -263,82 +258,76 @@ const spacesAndTabs: RegExp = /[ \t]{2,}/g;
263
258
  const lineStartWithSpaces: RegExp = /^[ \t]*/gm;
264
259
 
265
260
  function clean(value: string): string {
266
- return (
267
- value
268
- .replace(spacesAndTabs, ' ')
269
- .replace(lineStartWithSpaces, '')
270
- // using .trim() to clear the any newlines before the first text and after last text
271
- .trim()
272
- );
261
+ return (
262
+ value
263
+ .replace(spacesAndTabs, ' ')
264
+ .replace(lineStartWithSpaces, '')
265
+ // using .trim() to clear the any newlines before the first text and after last text
266
+ .trim()
267
+ );
273
268
  }
274
269
 
275
270
  export function addCommentToStartOfFile({
276
- j,
277
- base,
278
- message,
271
+ j,
272
+ base,
273
+ message,
279
274
  }: {
280
- j: core.JSCodeshift;
281
- base: Collection<Node>;
282
- message: string;
275
+ j: core.JSCodeshift;
276
+ base: Collection<Node>;
277
+ message: string;
283
278
  }) {
284
- addCommentBefore({
285
- j,
286
- // @ts-ignore
287
- target: base.find(j.Program),
288
- message,
289
- });
279
+ addCommentBefore({
280
+ j,
281
+ // @ts-ignore
282
+ target: base.find(j.Program),
283
+ message,
284
+ });
290
285
  }
291
286
 
292
287
  export function addCommentBefore({
293
- j,
294
- target,
295
- message,
288
+ j,
289
+ target,
290
+ message,
296
291
  }: {
297
- j: core.JSCodeshift;
298
- target: Collection<Node>;
299
- message: string;
292
+ j: core.JSCodeshift;
293
+ target: Collection<Node>;
294
+ message: string;
300
295
  }) {
301
- const content: string = ` TODO: (from codemod) ${clean(message)} `;
302
- target.forEach((path) => {
303
- path.value.comments = path.value.comments || [];
296
+ const content: string = ` TODO: (from codemod) ${clean(message)} `;
297
+ target.forEach((path) => {
298
+ path.value.comments = path.value.comments || [];
304
299
 
305
- const exists = path.value.comments.find(
306
- (comment) => comment.value === content,
307
- );
300
+ const exists = path.value.comments.find((comment) => comment.value === content);
308
301
 
309
- // avoiding duplicates of the same comment
310
- if (exists) {
311
- return;
312
- }
302
+ // avoiding duplicates of the same comment
303
+ if (exists) {
304
+ return;
305
+ }
313
306
 
314
- path.value.comments.push(j.commentBlock(content));
315
- });
307
+ path.value.comments.push(j.commentBlock(content));
308
+ });
316
309
  }
317
310
 
318
311
  export function updateRenderProps(
319
- j: core.JSCodeshift,
320
- source: Collection<any>,
321
- specifier: string,
322
- oldProperty: string,
323
- newProperty: string,
312
+ j: core.JSCodeshift,
313
+ source: Collection<any>,
314
+ specifier: string,
315
+ oldProperty: string,
316
+ newProperty: string,
324
317
  ) {
325
- source.findJSXElements(specifier).forEach((element: ASTPath<JSXElement>) => {
326
- j(element)
327
- .find(j.ArrowFunctionExpression)
328
- .find(j.ObjectPattern)
329
- .find(j.ObjectProperty)
330
- .filter(
331
- // @ts-ignore
332
- (path: ASTPath<ObjectProperty>) => path.value.key.name === oldProperty,
333
- )
334
- .forEach((path) => {
335
- j(path).replaceWith(
336
- j.property(
337
- 'init',
338
- j.identifier(newProperty),
339
- j.identifier(oldProperty),
340
- ),
341
- );
342
- });
343
- });
318
+ source.findJSXElements(specifier).forEach((element: ASTPath<JSXElement>) => {
319
+ j(element)
320
+ .find(j.ArrowFunctionExpression)
321
+ .find(j.ObjectPattern)
322
+ .find(j.ObjectProperty)
323
+ .filter(
324
+ // @ts-ignore
325
+ (path: ASTPath<ObjectProperty>) => path.value.key.name === oldProperty,
326
+ )
327
+ .forEach((path) => {
328
+ j(path).replaceWith(
329
+ j.property('init', j.identifier(newProperty), j.identifier(oldProperty)),
330
+ );
331
+ });
332
+ });
344
333
  }
@@ -20,9 +20,16 @@ var _tokens = require("@atlaskit/tokens");
20
20
  var _repositionOnUpdate = require("./reposition-on-update");
21
21
  var _useCloseManager = require("./use-close-manager");
22
22
  var _useFocusManager = require("./use-focus-manager");
23
- var _excluded = ["shouldRenderToParent", "children"];
23
+ var _excluded = ["shouldRenderToParent", "shouldFitContainer", "children"];
24
24
  var _css;
25
+ /**
26
+ * @jsxRuntime classic
27
+ */
25
28
  /** @jsx jsx */
29
+ // eslint-disable-next-line @atlaskit/ui-styling-standard/no-global-styles, @atlaskit/ui-styling-standard/use-compiled -- Ignored via go/DSP-18766
30
+ var popupFullWidthStyles = (0, _react2.css)({
31
+ width: '100%'
32
+ });
26
33
  var popupStyles = (0, _react2.css)((_css = {
27
34
  display: 'block',
28
35
  boxSizing: 'border-box',
@@ -31,7 +38,7 @@ var popupStyles = (0, _react2.css)((_css = {
31
38
  backgroundColor: "var(--ds-surface-overlay, ".concat(_colors.N0, ")"),
32
39
  borderRadius: "var(--ds-border-radius, 3px)",
33
40
  boxShadow: "var(--ds-shadow-overlay, ".concat("0 4px 8px -2px ".concat(_colors.N50A, ", 0 0 1px ").concat(_colors.N60A), ")")
34
- }, (0, _defineProperty2.default)(_css, _tokens.CURRENT_SURFACE_CSS_VAR, "var(--ds-surface-overlay, ".concat(_colors.N0, ")")), (0, _defineProperty2.default)(_css, ':focus', {
41
+ }, (0, _defineProperty2.default)(_css, _tokens.CURRENT_SURFACE_CSS_VAR, "var(--ds-surface-overlay, ".concat(_colors.N0, ")")), (0, _defineProperty2.default)(_css, '&:focus', {
35
42
  outline: 'none'
36
43
  }), _css));
37
44
  var popupOverflowStyles = (0, _react2.css)({
@@ -41,17 +48,18 @@ var popupOverflowStyles = (0, _react2.css)({
41
48
  // disables iframe pointer events while popup is open, except if iframe is nested inside popup
42
49
  // solves an issue of popup not being closed on iframe click
43
50
  var blockPointerEventsOnExternalIframeStyles = (0, _react2.css)({
44
- // eslint-disable-next-line @atlaskit/design-system/no-nested-styles
51
+ // eslint-disable-next-line @atlaskit/design-system/no-nested-styles, @atlaskit/ui-styling-standard/no-nested-selectors, @atlaskit/ui-styling-standard/no-unsafe-selectors -- Ignored via go/DSP-18766
45
52
  'iframe:not([data-ds--level] iframe)': {
46
53
  pointerEvents: 'none'
47
54
  }
48
55
  });
49
56
  var DefaultPopupComponent = /*#__PURE__*/(0, _react.forwardRef)(function (props, ref) {
50
57
  var shouldRenderToParent = props.shouldRenderToParent,
58
+ shouldFitContainer = props.shouldFitContainer,
51
59
  children = props.children,
52
60
  htmlAttributes = (0, _objectWithoutProperties2.default)(props, _excluded);
53
61
  return (0, _react2.jsx)("div", (0, _extends2.default)({
54
- css: [popupStyles, !shouldRenderToParent && popupOverflowStyles]
62
+ css: [popupStyles, !shouldRenderToParent && popupOverflowStyles, shouldFitContainer && popupFullWidthStyles]
55
63
  }, htmlAttributes, {
56
64
  ref: ref
57
65
  }), children);
@@ -76,6 +84,7 @@ function PopperWrapper(_ref) {
76
84
  triggerRef = _ref.triggerRef,
77
85
  shouldUseCaptureOnOutsideClick = _ref.shouldUseCaptureOnOutsideClick,
78
86
  shouldRenderToParent = _ref.shouldRenderToParent,
87
+ shouldFitContainer = _ref.shouldFitContainer,
79
88
  shouldDisableFocusLock = _ref.shouldDisableFocusLock,
80
89
  strategy = _ref.strategy,
81
90
  role = _ref.role,
@@ -146,13 +155,16 @@ function PopperWrapper(_ref) {
146
155
  }
147
156
  setPopupRef(node);
148
157
  }
149
- },
158
+ }
159
+ // eslint-disable-next-line @atlaskit/ui-styling-standard/enforce-style-prop -- Ignored via go/DSP-18766
160
+ ,
150
161
  style: style
151
162
  // using tabIndex={-1} would cause a bug where Safari focuses
152
163
  // first on the browser address bar when using keyboard
153
164
  ,
154
165
  tabIndex: autoFocus ? 0 : undefined,
155
- shouldRenderToParent: shouldRenderToParent
166
+ shouldRenderToParent: shouldRenderToParent,
167
+ shouldFitContainer: shouldFitContainer
156
168
  }, (0, _platformFeatureFlags.getBooleanFF)('platform.design-system-team.iframe_gojiv') && (0, _react2.jsx)(_react2.Global, {
157
169
  styles: blockPointerEventsOnExternalIframeStyles
158
170
  }), (0, _react2.jsx)(_repositionOnUpdate.RepositionOnUpdate, {