@flex-development/mlly 1.0.0-alpha.15 → 1.0.0-alpha.16

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 (239) hide show
  1. package/CHANGELOG.md +181 -0
  2. package/README.md +1 -0
  3. package/dist/enums/assert-type.mjs +1 -7
  4. package/dist/enums/format.mjs +1 -10
  5. package/dist/enums/index.mjs +0 -1
  6. package/dist/enums/kind-specifier-syntax.mjs +1 -7
  7. package/dist/enums/kind-specifier.mjs +1 -8
  8. package/dist/enums/kind-statement-syntax.mjs +1 -15
  9. package/dist/enums/kind-statement.mjs +1 -8
  10. package/dist/index.mjs.map +5 -2
  11. package/dist/interfaces/import-dynamic.d.mts +1 -3
  12. package/dist/interfaces/import-static.d.mts +1 -3
  13. package/dist/interfaces/index.mjs +0 -1
  14. package/dist/interfaces/options-find-subpath.d.mts +4 -3
  15. package/dist/interfaces/options-get-format.d.mts +7 -7
  16. package/dist/interfaces/options-get-source.d.mts +5 -4
  17. package/dist/interfaces/options-parse-module-id.d.mts +4 -3
  18. package/dist/interfaces/options-parse-subpath.d.mts +4 -3
  19. package/dist/interfaces/options-resolve-alias.d.mts +5 -5
  20. package/dist/interfaces/options-resolve-module.d.mts +6 -6
  21. package/dist/internal/dequote.d.mts +14 -0
  22. package/dist/internal/dequote.mjs +6 -0
  23. package/dist/internal/format-type-map.d.mts +2 -0
  24. package/dist/internal/format-type-map.mjs +0 -1
  25. package/dist/internal/get-specifier-kind.d.mts +2 -0
  26. package/dist/internal/get-specifier-kind.mjs +3 -7
  27. package/dist/internal/get-subpaths.d.mts +5 -2
  28. package/dist/internal/get-subpaths.mjs +2 -5
  29. package/dist/internal/regex-encoded-sep.d.mts +2 -0
  30. package/dist/internal/regex-encoded-sep.mjs +0 -1
  31. package/dist/internal/regex-internal-specifier.d.mts +2 -0
  32. package/dist/internal/regex-internal-specifier.mjs +0 -1
  33. package/dist/internal/regex-invalid-segment.d.mts +2 -0
  34. package/dist/internal/regex-invalid-segment.mjs +4 -7
  35. package/dist/internal/regex-package-name.d.mts +2 -0
  36. package/dist/internal/regex-package-name.mjs +0 -1
  37. package/dist/internal/regex-package-path.d.mts +2 -0
  38. package/dist/internal/regex-package-path.mjs +0 -1
  39. package/dist/internal/resolver.d.mts +5 -3
  40. package/dist/internal/resolver.mjs +115 -130
  41. package/dist/internal/validate-array-set.d.mts +7 -5
  42. package/dist/internal/validate-array-set.mjs +5 -5
  43. package/dist/internal/validate-boolean.d.mts +4 -2
  44. package/dist/internal/validate-boolean.mjs +3 -3
  45. package/dist/internal/validate-map.d.mts +10 -7
  46. package/dist/internal/validate-map.mjs +5 -5
  47. package/dist/internal/validate-object.d.mts +9 -9
  48. package/dist/internal/validate-object.mjs +3 -3
  49. package/dist/internal/validate-set.d.mts +7 -5
  50. package/dist/internal/validate-set.mjs +5 -5
  51. package/dist/internal/validate-string.d.mts +5 -2
  52. package/dist/internal/validate-string.mjs +3 -3
  53. package/dist/internal/validate-url-string.d.mts +4 -2
  54. package/dist/internal/validate-url-string.mjs +3 -3
  55. package/dist/types/fn-change-ext.d.mts +7 -4
  56. package/dist/types/index.mjs +0 -1
  57. package/dist/utils/compare-subpaths.mjs +5 -10
  58. package/dist/utils/compare-subpaths.mjs.map +6 -3
  59. package/dist/utils/conditions.mjs.map +5 -2
  60. package/dist/utils/detect-syntax.mjs +1 -2
  61. package/dist/utils/detect-syntax.mjs.map +6 -3
  62. package/dist/utils/extension-format-map.mjs.map +5 -2
  63. package/dist/utils/extract-statements.mjs +6 -7
  64. package/dist/utils/extract-statements.mjs.map +6 -3
  65. package/dist/utils/fill-modules.mjs +43 -46
  66. package/dist/utils/fill-modules.mjs.map +9 -4
  67. package/dist/utils/find-dynamic-imports.mjs +23 -26
  68. package/dist/utils/find-dynamic-imports.mjs.map +9 -4
  69. package/dist/utils/find-exports.mjs +15 -20
  70. package/dist/utils/find-exports.mjs.map +9 -4
  71. package/dist/utils/find-requires.mjs +5 -5
  72. package/dist/utils/find-requires.mjs.map +9 -4
  73. package/dist/utils/find-static-imports.mjs +17 -21
  74. package/dist/utils/find-static-imports.mjs.map +9 -4
  75. package/dist/utils/find-subpath.d.mts +3 -3
  76. package/dist/utils/find-subpath.mjs +52 -74
  77. package/dist/utils/find-subpath.mjs.map +10 -4
  78. package/dist/utils/get-format.mjs +18 -33
  79. package/dist/utils/get-format.mjs.map +9 -4
  80. package/dist/utils/get-source.d.mts +3 -2
  81. package/dist/utils/get-source.mjs +10 -19
  82. package/dist/utils/get-source.mjs.map +6 -3
  83. package/dist/utils/has-cjs-syntax.mjs.map +5 -2
  84. package/dist/utils/has-esm-syntax.mjs.map +5 -2
  85. package/dist/utils/index.d.mts +2 -0
  86. package/dist/utils/index.mjs +46 -42
  87. package/dist/utils/index.mjs.map +9 -4
  88. package/dist/utils/is-absolute-specifier.mjs +5 -6
  89. package/dist/utils/is-absolute-specifier.mjs.map +6 -3
  90. package/dist/utils/is-bare-specifier.mjs +2 -4
  91. package/dist/utils/is-bare-specifier.mjs.map +6 -3
  92. package/dist/utils/is-directory.mjs +14 -0
  93. package/dist/utils/is-directory.mjs.map +9 -0
  94. package/dist/utils/is-exports-sugar.d.mts +3 -2
  95. package/dist/utils/is-exports-sugar.mjs +16 -13
  96. package/dist/utils/is-exports-sugar.mjs.map +6 -3
  97. package/dist/utils/is-file.mjs +14 -0
  98. package/dist/utils/is-file.mjs.map +9 -0
  99. package/dist/utils/is-relative-specifier.d.mts +0 -1
  100. package/dist/utils/is-relative-specifier.mjs +2 -4
  101. package/dist/utils/is-relative-specifier.mjs.map +6 -3
  102. package/dist/utils/lookup-package-scope.d.mts +1 -1
  103. package/dist/utils/lookup-package-scope.mjs +4 -8
  104. package/dist/utils/lookup-package-scope.mjs.map +6 -3
  105. package/dist/utils/parse-data-url.mjs +4 -4
  106. package/dist/utils/parse-data-url.mjs.map +6 -3
  107. package/dist/utils/parse-module-id.mjs +22 -24
  108. package/dist/utils/parse-module-id.mjs.map +10 -4
  109. package/dist/utils/parse-subpath.d.mts +3 -2
  110. package/dist/utils/parse-subpath.mjs +40 -55
  111. package/dist/utils/parse-subpath.mjs.map +9 -4
  112. package/dist/utils/pattern-character.mjs.map +5 -2
  113. package/dist/utils/read-package-json.mjs +12 -9
  114. package/dist/utils/read-package-json.mjs.map +6 -3
  115. package/dist/utils/resolve-alias.mjs +28 -34
  116. package/dist/utils/resolve-alias.mjs.map +10 -4
  117. package/dist/utils/resolve-aliases.mjs +15 -17
  118. package/dist/utils/resolve-aliases.mjs.map +6 -3
  119. package/dist/utils/resolve-extensions.mjs.map +5 -2
  120. package/dist/utils/resolve-module.mjs +10 -26
  121. package/dist/utils/resolve-module.mjs.map +6 -3
  122. package/dist/utils/resolve-modules.mjs +12 -15
  123. package/dist/utils/resolve-modules.mjs.map +6 -3
  124. package/dist/utils/to-absolute-specifier.mjs.map +5 -2
  125. package/dist/utils/to-bare-specifier.mjs +18 -38
  126. package/dist/utils/to-bare-specifier.mjs.map +6 -3
  127. package/dist/utils/to-data-url.mjs +1 -5
  128. package/dist/utils/to-data-url.mjs.map +6 -3
  129. package/dist/utils/to-node-url.mjs +1 -4
  130. package/dist/utils/to-node-url.mjs.map +6 -3
  131. package/dist/utils/to-relative-specifier.mjs +2 -16
  132. package/dist/utils/to-relative-specifier.mjs.map +6 -3
  133. package/dist/utils/to-url.mjs +1 -5
  134. package/dist/utils/to-url.mjs.map +6 -3
  135. package/dist/utils/validate-assertions.d.mts +2 -2
  136. package/dist/utils/validate-assertions.mjs +14 -21
  137. package/dist/utils/validate-assertions.mjs.map +9 -4
  138. package/dist/utils/validate-exports.d.mts +3 -2
  139. package/dist/utils/validate-exports.mjs +25 -24
  140. package/dist/utils/validate-exports.mjs.map +6 -3
  141. package/package.json +89 -81
  142. package/src/interfaces/import-dynamic.ts +1 -3
  143. package/src/interfaces/import-static.ts +1 -5
  144. package/src/interfaces/options-find-subpath.ts +4 -3
  145. package/src/interfaces/options-get-format.ts +7 -7
  146. package/src/interfaces/options-get-source.ts +5 -4
  147. package/src/interfaces/options-parse-module-id.ts +4 -3
  148. package/src/interfaces/options-parse-subpath.ts +4 -3
  149. package/src/interfaces/options-resolve-alias.ts +5 -5
  150. package/src/interfaces/options-resolve-module.ts +6 -6
  151. package/src/internal/dequote.ts +18 -0
  152. package/src/internal/format-type-map.ts +2 -0
  153. package/src/internal/get-specifier-kind.ts +7 -4
  154. package/src/internal/get-subpaths.ts +7 -5
  155. package/src/internal/regex-encoded-sep.ts +2 -0
  156. package/src/internal/regex-internal-specifier.ts +2 -0
  157. package/src/internal/regex-invalid-segment.ts +2 -0
  158. package/src/internal/regex-package-name.ts +2 -0
  159. package/src/internal/regex-package-path.ts +2 -0
  160. package/src/internal/resolver.ts +71 -49
  161. package/src/internal/validate-array-set.ts +10 -7
  162. package/src/internal/validate-boolean.ts +6 -3
  163. package/src/internal/validate-map.ts +12 -9
  164. package/src/internal/validate-object.ts +10 -10
  165. package/src/internal/validate-set.ts +9 -9
  166. package/src/internal/validate-string.ts +7 -3
  167. package/src/internal/validate-url-string.ts +6 -3
  168. package/src/types/fn-change-ext.ts +7 -7
  169. package/src/utils/extract-statements.ts +11 -7
  170. package/src/utils/fill-modules.ts +70 -62
  171. package/src/utils/find-dynamic-imports.ts +6 -6
  172. package/src/utils/find-exports.ts +19 -29
  173. package/src/utils/find-requires.ts +6 -6
  174. package/src/utils/find-static-imports.ts +11 -14
  175. package/src/utils/find-subpath.ts +140 -139
  176. package/src/utils/get-format.ts +27 -21
  177. package/src/utils/get-source.ts +5 -5
  178. package/src/utils/index.ts +2 -0
  179. package/src/utils/is-bare-specifier.ts +2 -1
  180. package/src/{internal → utils}/is-directory.ts +1 -1
  181. package/src/utils/is-exports-sugar.ts +16 -9
  182. package/src/{internal → utils}/is-file.ts +1 -1
  183. package/src/utils/is-relative-specifier.ts +5 -6
  184. package/src/utils/lookup-package-scope.ts +2 -2
  185. package/src/utils/parse-data-url.ts +3 -3
  186. package/src/utils/parse-module-id.ts +16 -8
  187. package/src/utils/parse-subpath.ts +32 -19
  188. package/src/utils/read-package-json.ts +13 -6
  189. package/src/utils/resolve-alias.ts +19 -15
  190. package/src/utils/resolve-aliases.ts +25 -25
  191. package/src/utils/resolve-module.ts +4 -5
  192. package/src/utils/resolve-modules.ts +19 -21
  193. package/src/utils/to-bare-specifier.ts +12 -7
  194. package/src/utils/to-relative-specifier.ts +2 -1
  195. package/src/utils/validate-assertions.ts +12 -7
  196. package/src/utils/validate-exports.ts +25 -18
  197. package/dist/enums/assert-type.mjs.map +0 -6
  198. package/dist/enums/format.mjs.map +0 -6
  199. package/dist/enums/index.mjs.map +0 -6
  200. package/dist/enums/kind-specifier-syntax.mjs.map +0 -6
  201. package/dist/enums/kind-specifier.mjs.map +0 -6
  202. package/dist/enums/kind-statement-syntax.mjs.map +0 -6
  203. package/dist/enums/kind-statement.mjs.map +0 -6
  204. package/dist/interfaces/index.mjs.map +0 -6
  205. package/dist/internal/escape-reg-exp.d.mts +0 -16
  206. package/dist/internal/escape-reg-exp.mjs +0 -10
  207. package/dist/internal/escape-reg-exp.mjs.map +0 -6
  208. package/dist/internal/format-type-map.mjs.map +0 -6
  209. package/dist/internal/get-specifier-kind.mjs.map +0 -6
  210. package/dist/internal/get-subpaths.mjs.map +0 -6
  211. package/dist/internal/is-array-index.d.mts +0 -15
  212. package/dist/internal/is-array-index.mjs +0 -9
  213. package/dist/internal/is-array-index.mjs.map +0 -6
  214. package/dist/internal/is-directory.mjs +0 -16
  215. package/dist/internal/is-directory.mjs.map +0 -6
  216. package/dist/internal/is-file.mjs +0 -16
  217. package/dist/internal/is-file.mjs.map +0 -6
  218. package/dist/internal/is-function.d.mts +0 -12
  219. package/dist/internal/is-function.mjs +0 -8
  220. package/dist/internal/is-function.mjs.map +0 -6
  221. package/dist/internal/regex-encoded-sep.mjs.map +0 -6
  222. package/dist/internal/regex-internal-specifier.mjs.map +0 -6
  223. package/dist/internal/regex-invalid-segment.mjs.map +0 -6
  224. package/dist/internal/regex-package-name.mjs.map +0 -6
  225. package/dist/internal/regex-package-path.mjs.map +0 -6
  226. package/dist/internal/resolver.mjs.map +0 -6
  227. package/dist/internal/validate-array-set.mjs.map +0 -6
  228. package/dist/internal/validate-boolean.mjs.map +0 -6
  229. package/dist/internal/validate-map.mjs.map +0 -6
  230. package/dist/internal/validate-object.mjs.map +0 -6
  231. package/dist/internal/validate-set.mjs.map +0 -6
  232. package/dist/internal/validate-string.mjs.map +0 -6
  233. package/dist/internal/validate-url-string.mjs.map +0 -6
  234. package/dist/types/index.mjs.map +0 -6
  235. package/src/internal/escape-reg-exp.ts +0 -24
  236. package/src/internal/is-array-index.ts +0 -28
  237. package/src/internal/is-function.ts +0 -16
  238. /package/dist/{internal → utils}/is-directory.d.mts +0 -0
  239. /package/dist/{internal → utils}/is-file.d.mts +0 -0
@@ -3,7 +3,7 @@
3
3
  * @module mlly/types/ChangeExtFn
4
4
  */
5
5
 
6
- import type { Nilable } from '@flex-development/tutils'
6
+ import type { Fn, Nilable } from '@flex-development/tutils'
7
7
  import type { URL } from 'node:url'
8
8
 
9
9
  /**
@@ -19,15 +19,15 @@ import type { URL } from 'node:url'
19
19
  * @see {@linkcode URL}
20
20
  * @see https://github.com/flex-development/pathe/tree/1.0.3#changeextpath-string-ext-nullablestring-string
21
21
  *
22
- * @template Ext - File extension type(s)
22
+ * @template X - File extension type
23
23
  *
24
24
  * @param {string} specifier - Original module specifier
25
25
  * @param {URL} url - Resolved module URL
26
- * @return {Ext | PromiseLike<Ext>} New file extension, `null`, or `undefined`
26
+ * @return {PromiseLike<X> | X} New file extension, `null`, or `undefined`
27
27
  */
28
- type ChangeExtFn<Ext extends Nilable<string> = Nilable<string>> = (
29
- specifier: string,
30
- url: URL
31
- ) => Ext | PromiseLike<Ext>
28
+ type ChangeExtFn<X extends Nilable<string> = Nilable<string>> = Fn<
29
+ [specifier: string, url: URL],
30
+ PromiseLike<X> | X
31
+ >
32
32
 
33
33
  export type { ChangeExtFn as default }
@@ -6,6 +6,7 @@
6
6
  import type { Statement } from '#src/interfaces'
7
7
  import validateString from '#src/internal/validate-string'
8
8
  import type { NodeError } from '@flex-development/errnode'
9
+ import { sort, trim } from '@flex-development/tutils'
9
10
  import findDynamicImports from './find-dynamic-imports'
10
11
  import findExports from './find-exports'
11
12
  import findRequires from './find-requires'
@@ -29,14 +30,17 @@ const extractStatements = (code: string = ''): Statement[] => {
29
30
  validateString(code, 'code')
30
31
 
31
32
  // code shorter than first shortest keyword => no possible matches
32
- if (code.trim().length < 'export'.length) return []
33
+ if (trim(code).length < 'export'.length) return []
33
34
 
34
- return [
35
- ...findDynamicImports(code),
36
- ...findExports(code),
37
- ...findRequires(code),
38
- ...findStaticImports(code)
39
- ]
35
+ return sort(
36
+ [
37
+ ...findDynamicImports(code),
38
+ ...findExports(code),
39
+ ...findRequires(code),
40
+ ...findStaticImports(code)
41
+ ],
42
+ (s1: Statement, s2: Statement): number => s1.start - s2.start
43
+ )
40
44
  }
41
45
 
42
46
  export default extractStatements
@@ -5,8 +5,6 @@
5
5
 
6
6
  import { SpecifierSyntaxKind } from '#src/enums'
7
7
  import type { FillModuleOptions } from '#src/interfaces'
8
- import regexp from '#src/internal/escape-reg-exp'
9
- import isFunction from '#src/internal/is-function'
10
8
  import validateArraySet from '#src/internal/validate-array-set'
11
9
  import validateURLString from '#src/internal/validate-url-string'
12
10
  import {
@@ -14,6 +12,13 @@ import {
14
12
  type NodeError
15
13
  } from '@flex-development/errnode'
16
14
  import pathe from '@flex-development/pathe'
15
+ import {
16
+ DOT,
17
+ isFunction,
18
+ regexp,
19
+ trim,
20
+ type Optional
21
+ } from '@flex-development/tutils'
17
22
  import type { URL } from 'node:url'
18
23
  import CONDITIONS from './conditions'
19
24
  import extractStatements from './extract-statements'
@@ -46,77 +51,80 @@ const fillModules = async (
46
51
  ): Promise<string> => {
47
52
  const { conditions = CONDITIONS, ext, parent = import.meta.url } = options
48
53
 
54
+ // validate options
49
55
  validateArraySet(conditions, 'options.conditions')
50
56
  validateURLString(parent, 'options.parent')
51
57
 
52
58
  // ensure specifiers have file extensions
53
59
  for (const statement of extractStatements(code)) {
54
- // do nothing if statement does not have specifier
55
- if (!statement.specifier) continue
56
-
57
- // ignore statements with dynamic specifiers
58
- if (statement.specifier_syntax === SpecifierSyntaxKind.DYNAMIC) continue
59
-
60
- /**
61
- * Resolved module URL.
62
- *
63
- * @const {URL} url
64
- */
65
- const url: URL = await resolveModule(statement.specifier, {
66
- ...options,
67
- /**
68
- * Returns a replacement file extension for the given module `specifier`
69
- * **if it is non-bare and does not already have an extension**.
70
- *
71
- * Throws [`ERR_UNKNOWN_FILE_EXTENSION`][1] if the replacement extension
72
- * is `null`, `undefined`, an empty string, or a dot character (`'.'`).
73
- *
74
- * [1]: https://nodejs.org/api/errors.html#err_unknown_file_extension
75
- *
76
- * @async
77
- *
78
- * @param {string} specifier - Module specifier
79
- * @param {URL} url - Resolved module URL
80
- * @return {Promise<string | undefined>} New file extension or `undefined`
81
- */
82
- async ext(specifier: string, url: URL): Promise<string | undefined> {
83
- // skip replacement for bare specifiers
84
- if (isBareSpecifier(specifier)) return void 0
85
-
86
- // skip replacement for specifiers that are already fully specified
87
- if (pathe.extname(specifier) === pathe.extname(url.href)) return void 0
88
-
60
+ if (statement.specifier) {
61
+ if (statement.specifier_syntax !== SpecifierSyntaxKind.DYNAMIC) {
89
62
  /**
90
- * Replacement file extension.
63
+ * Resolved module URL.
91
64
  *
92
- * @var {string} rext
65
+ * @const {URL} url
93
66
  */
94
- const rext: string = isFunction(ext) ? await ext(specifier, url) : ext
67
+ const url: URL = await resolveModule(statement.specifier, {
68
+ ...options,
69
+ /**
70
+ * Returns a replacement file extension for the given `specifier` if
71
+ * it is non-bare and does not already have an extension.
72
+ *
73
+ * Throws [`ERR_UNKNOWN_FILE_EXTENSION`][1] if the new extension is
74
+ * `null`, `undefined`, an empty string, or a dot character (`'.'`).
75
+ *
76
+ * [1]: https://nodejs.org/api/errors.html#err_unknown_file_extension
77
+ *
78
+ * @async
79
+ *
80
+ * @param {string} specifier - Module specifier
81
+ * @param {URL} url - Resolved module URL
82
+ * @return {Promise<Optional<string>>} New file extension
83
+ */
84
+ async ext(specifier: string, url: URL): Promise<Optional<string>> {
85
+ // skip replacement for bare specifiers
86
+ if (isBareSpecifier(specifier)) return void 0
95
87
 
96
- // ensure replacement extension is non-empty and non-dot ('.')
97
- if (!(rext && rext.trim().length > (rext.startsWith('.') ? 1 : 0))) {
98
- throw new ERR_UNKNOWN_FILE_EXTENSION(rext, specifier)
99
- }
88
+ // skip replacement for specifiers that are already fully specified
89
+ if (pathe.extname(specifier) === pathe.extname(url.href)) {
90
+ return void 0
91
+ }
100
92
 
101
- return rext
102
- }
103
- })
93
+ /**
94
+ * Replacement file extension.
95
+ *
96
+ * @var {string} rext
97
+ */
98
+ const rext: string = isFunction(ext)
99
+ ? await ext(specifier, url)
100
+ : ext
101
+
102
+ // ensure replacement extension is non-empty and non-dot ('.')
103
+ if (!(rext && trim(rext).length > (rext.startsWith(DOT) ? 1 : 0))) {
104
+ throw new ERR_UNKNOWN_FILE_EXTENSION(rext, specifier)
105
+ }
104
106
 
105
- // replace original module specifier
106
- code = code.replace(
107
- statement.code,
108
- statement.code.replace(
109
- new RegExp(`(?<=["'])${regexp(statement.specifier)}(?=["'])`),
110
- // convert module url back to absolute, bare, or relative specifier
111
- statement.specifier.startsWith('#')
112
- ? statement.specifier
113
- : isAbsoluteSpecifier(statement.specifier)
114
- ? url.href
115
- : isBareSpecifier(statement.specifier)
116
- ? toBareSpecifier(url, parent, new Set(conditions))
117
- : toRelativeSpecifier(url, parent)
118
- )
119
- )
107
+ return rext
108
+ }
109
+ })
110
+
111
+ // replace original module specifier
112
+ code = code.replace(
113
+ statement.code,
114
+ statement.code.replace(
115
+ new RegExp(`(?<=["'])${regexp(statement.specifier)}(?=["'])`),
116
+ // convert module url back to absolute, bare, or relative specifier
117
+ statement.specifier.startsWith('#')
118
+ ? statement.specifier
119
+ : isAbsoluteSpecifier(statement.specifier)
120
+ ? url.href
121
+ : isBareSpecifier(statement.specifier)
122
+ ? toBareSpecifier(url, parent, new Set(conditions))
123
+ : toRelativeSpecifier(url, parent)
124
+ )
125
+ )
126
+ }
127
+ }
120
128
  }
121
129
 
122
130
  return code
@@ -9,10 +9,12 @@ import {
9
9
  StatementSyntaxKind
10
10
  } from '#src/enums'
11
11
  import type { DynamicImport } from '#src/interfaces'
12
+ import dequote from '#src/internal/dequote'
12
13
  import getSpecifierKind from '#src/internal/get-specifier-kind'
13
14
  import validateString from '#src/internal/validate-string'
14
15
  import type { NodeError } from '@flex-development/errnode'
15
16
  import { DYNAMIC_IMPORT_REGEX } from '@flex-development/import-regex'
17
+ import { split, trim } from '@flex-development/tutils'
16
18
 
17
19
  /**
18
20
  * Finds all dynamic import statements in `code`. Ignores matches in comments.
@@ -53,14 +55,12 @@ const findDynamicImports = (code: string = ''): DynamicImport[] => {
53
55
  imports:
54
56
  imports === ''
55
57
  ? []
56
- : imports
57
- .replace(/^{|}$/g, '')
58
- .split(',')
59
- .map(e => e.trim())
60
- .filter(e => e.length > 0),
58
+ : split(imports.replace(/^{|}$/g, ''), ',')
59
+ .map(trim)
60
+ .filter(e => !!e.length),
61
61
  kind: StatementKind.IMPORT,
62
62
  options,
63
- specifier: specifier.replace(/^["']|["']$/g, ''),
63
+ specifier: dequote(specifier),
64
64
  specifier_kind:
65
65
  specifier_syntax === SpecifierSyntaxKind.DYNAMIC
66
66
  ? null
@@ -11,7 +11,6 @@ import {
11
11
  import type { ExportStatement } from '#src/interfaces'
12
12
  import getSpecifierKind from '#src/internal/get-specifier-kind'
13
13
  import validateString from '#src/internal/validate-string'
14
- import type { Declaration } from '#src/types'
15
14
  import type { NodeError } from '@flex-development/errnode'
16
15
  import {
17
16
  EXPORT_AGGREGATE_REGEX,
@@ -19,6 +18,7 @@ import {
19
18
  EXPORT_DEFAULT_REGEX,
20
19
  EXPORT_LIST_REGEX
21
20
  } from '@flex-development/export-regex'
21
+ import { cast, sort, split, trim } from '@flex-development/tutils'
22
22
 
23
23
  /**
24
24
  * Finds all export statements in `code`. Ignores matches in comments.
@@ -55,11 +55,9 @@ const findExports = (code: string = ''): ExportStatement[] => {
55
55
  end: start + code.length,
56
56
  exports: exports.startsWith('*')
57
57
  ? [exports]
58
- : exports
59
- .replace(/^{|}$/g, '')
60
- .split(',')
61
- .map(e => e.trim())
62
- .filter(e => e.length > 0),
58
+ : split(exports.replace(/^{|}$/g, ''), ',')
59
+ .map(trim)
60
+ .filter(e => !!e.length),
63
61
  kind: StatementKind.EXPORT,
64
62
  modifiers: [],
65
63
  specifier,
@@ -80,23 +78,20 @@ const findExports = (code: string = ''): ExportStatement[] => {
80
78
 
81
79
  statements.push({
82
80
  code,
83
- declaration: declaration as Declaration,
81
+ declaration: cast(declaration),
84
82
  end: start + code.length,
85
83
  exports: /^\w+$/.test(exports)
86
84
  ? [exports]
87
- : exports
88
- .replace(/^[[{]|[\]}]$/g, '')
89
- .split(',')
90
- .map(e => e.trim().replace(/\s*=\s*.*$/, ''))
91
- .filter(e => e.length > 0),
85
+ : split(exports.replace(/^[[{]|[\]}]$/g, ''), ',')
86
+ .map(e => trim(e).replace(/\s*=\s*.*$/, ''))
87
+ .filter(e => !!e.length),
92
88
  kind: StatementKind.EXPORT,
93
89
  modifiers:
94
90
  modifiers === ''
95
91
  ? []
96
- : modifiers
97
- .split(' ')
98
- .map(e => e.trim())
99
- .filter(e => e.length > 0),
92
+ : split(modifiers, ' ')
93
+ .map(trim)
94
+ .filter(e => !!e.length),
100
95
  specifier: null,
101
96
  specifier_kind: null,
102
97
  specifier_syntax: null,
@@ -113,17 +108,16 @@ const findExports = (code: string = ''): ExportStatement[] => {
113
108
 
114
109
  statements.push({
115
110
  code,
116
- declaration: declaration ? (declaration as Declaration) : null,
111
+ declaration: declaration ? cast(declaration) : null,
117
112
  end: start + code.length,
118
113
  exports: exports === '' ? [] : [exports],
119
114
  kind: StatementKind.EXPORT,
120
115
  modifiers:
121
116
  modifiers === ''
122
117
  ? []
123
- : modifiers
124
- .split(' ')
125
- .map(e => e.trim())
126
- .filter(e => e.length > 0),
118
+ : split(modifiers, ' ')
119
+ .map(trim)
120
+ .filter(e => !!e.length),
127
121
  specifier: null,
128
122
  specifier_kind: null,
129
123
  specifier_syntax: null,
@@ -142,11 +136,9 @@ const findExports = (code: string = ''): ExportStatement[] => {
142
136
  code,
143
137
  declaration: null,
144
138
  end: start + code.length,
145
- exports: exports
146
- .replace(/^{|}$/g, '')
147
- .split(',')
148
- .map(e => e.trim())
149
- .filter(e => e.length > 0),
139
+ exports: split(exports.replace(/^{|}$/g, ''), ',')
140
+ .map(trim)
141
+ .filter(e => !!e.length),
150
142
  kind: StatementKind.EXPORT,
151
143
  modifiers: [],
152
144
  specifier: null,
@@ -158,9 +150,7 @@ const findExports = (code: string = ''): ExportStatement[] => {
158
150
  })
159
151
  }
160
152
 
161
- return statements.sort((s1: ExportStatement, s2: ExportStatement): number => {
162
- return s1.start - s2.start
163
- })
153
+ return sort(statements, (s1, s2): number => s1.start - s2.start)
164
154
  }
165
155
 
166
156
  export default findExports
@@ -9,9 +9,11 @@ import {
9
9
  StatementSyntaxKind
10
10
  } from '#src/enums'
11
11
  import type { RequireStatement } from '#src/interfaces'
12
+ import dequote from '#src/internal/dequote'
12
13
  import getSpecifierKind from '#src/internal/get-specifier-kind'
13
14
  import validateString from '#src/internal/validate-string'
14
15
  import type { NodeError } from '@flex-development/errnode'
16
+ import { split, trim } from '@flex-development/tutils'
15
17
 
16
18
  /**
17
19
  * Finds all `require` statements in `code`. Ignores matches in comments.
@@ -54,13 +56,11 @@ const findRequires = (code: string = ''): RequireStatement[] => {
54
56
  imports:
55
57
  imports === ''
56
58
  ? []
57
- : imports
58
- .replace(/^{|}$/g, '')
59
- .split(',')
60
- .map(e => e.trim())
61
- .filter(e => e.length > 0),
59
+ : split(imports.replace(/^{|}$/g, ''), ',')
60
+ .map(trim)
61
+ .filter(e => !!e.length),
62
62
  kind: StatementKind.REQUIRE,
63
- specifier: specifier.replace(/^["']|["']$/g, ''),
63
+ specifier: dequote(specifier),
64
64
  specifier_kind:
65
65
  specifier_syntax === SpecifierSyntaxKind.DYNAMIC
66
66
  ? null
@@ -13,6 +13,7 @@ import getSpecifierKind from '#src/internal/get-specifier-kind'
13
13
  import validateString from '#src/internal/validate-string'
14
14
  import type { NodeError } from '@flex-development/errnode'
15
15
  import { STATIC_IMPORT_REGEX } from '@flex-development/import-regex'
16
+ import { split, trim } from '@flex-development/tutils'
16
17
 
17
18
  /**
18
19
  * Finds all static import statements in `code`. Ignores matches in comments.
@@ -58,22 +59,18 @@ const findStaticImports = (code: string = ''): StaticImport[] => {
58
59
  syntax === StatementSyntaxKind.SIDE_EFFECT
59
60
  ? []
60
61
  : syntax === StatementSyntaxKind.NAMED
61
- ? imports
62
- .replace(/^{|}$/g, '')
63
- .split(',')
64
- .map(e => e.trim())
65
- .filter(e => e.length > 0)
62
+ ? split(imports.replace(/^{|}$/g, ''), ',')
63
+ .map(trim)
64
+ .filter(i => !!i.length)
66
65
  : syntax === StatementSyntaxKind.DEFAULT_WITH_NAMED
67
- ? imports
68
- .split(',')
69
- .map(i => i.trim().replace(/^{|}$/g, ''))
70
- .map(i => i.trim())
71
- .filter(i => i.length > 0)
66
+ ? split(imports, ',')
67
+ .map(i => trim(i).replace(/^{|}$/g, ''))
68
+ .map(trim)
69
+ .filter(i => !!i.length)
72
70
  : syntax === StatementSyntaxKind.DEFAULT_WITH_NAMESPACE
73
- ? imports
74
- .split(',')
75
- .map(i => i.trim())
76
- .filter(i => i.length > 0)
71
+ ? split(imports, ',')
72
+ .map(trim)
73
+ .filter(i => !!i.length)
77
74
  : [imports],
78
75
  kind: StatementKind.IMPORT,
79
76
  specifier,