@tamagui/babel-plugin-fully-specified 3.0.0-beta.924.1 → 3.0.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.
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@tamagui/babel-plugin-fully-specified",
3
- "version": "3.0.0-beta.924.1",
3
+ "version": "3.0.0",
4
4
  "gitHead": "a49cc7ea6b93ba384e77a4880ae48ac4a5635c14",
5
5
  "license": "MIT",
6
6
  "source": "src/index.ts",
@@ -48,5 +48,6 @@
48
48
  "type": "git",
49
49
  "url": "git+https://github.com/tamagui/tamagui.git",
50
50
  "directory": "code/packages/babel-plugin-fully-specified"
51
- }
51
+ },
52
+ "releaseSourceCommit": "15fbca480b143f876f6975601e23a17d3f90d2ee"
52
53
  }
@@ -58,7 +58,22 @@ function fullySpecifyCommonJS(api, options) {
58
58
  moduleSpecifier
59
59
  )
60
60
  let newModuleSpecifier = moduleSpecifier
61
+ if (
62
+ cjsExtension.startsWith('.native') &&
63
+ ((0, import_node_fs.existsSync)(`${resolvedPath}.ios.js`) ||
64
+ (0, import_node_fs.existsSync)(`${resolvedPath}.android.js`))
65
+ ) {
66
+ return
67
+ }
61
68
  if (isLocalDirectory(resolvedPath)) {
69
+ const indexBase = (0, import_node_path.resolve)(resolvedPath, 'index')
70
+ if (
71
+ cjsExtension.startsWith('.native') &&
72
+ ((0, import_node_fs.existsSync)(`${indexBase}.ios.js`) ||
73
+ (0, import_node_fs.existsSync)(`${indexBase}.android.js`))
74
+ ) {
75
+ return
76
+ }
62
77
  const indexPath = (0, import_node_path.resolve)(
63
78
  resolvedPath,
64
79
  'index' + jsExtension
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../src/commonjs.ts"],
4
- "mappings": ";;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,qBAAsC;AACtC,uBAA0C;AAE3B,SAAR,qBACL,KACA,SAGiB;AACjB,MAAI,cAAc,CAAC;AAEnB,SAAO;AAAA,IACL,MAAM;AAAA,IACN,SAAS;AAAA,MACP,eAAe,MAAM,OAAO;AAC1B,cAAM,SAAS,KAAK,IAAI,QAAQ;AAEhC,YACE,OAAO,aAAa,EAAE,MAAM,UAAU,CAAC,KACvC,KAAK,KAAK,UAAU,WAAW,GAC/B;AACA,gBAAM,MAAM,KAAK,KAAK,UAAU,CAAC;AACjC,cAAI,IAAI,SAAS,iBAAiB;AAChC,gBAAI,kBAAkB,IAAI;AAG1B,gBAAI,gBAAgB,WAAW,GAAG,KAAK,gBAAgB,WAAW,GAAG,GAAG;AACtE,oBAAM,WAAW,MAAM,KAAK,KAAK;AACjC,kBAAI,CAAC,SAAU;AAEf,oBAAM,cAAU,0BAAQ,QAAQ;AAChC,oBAAM,eAAe,QAAQ,sBAAsB;AACnD,oBAAM,cAAc;AAIpB,oBAAM,yBAAqB,0BAAQ,eAAe;AAClD,oBAAM,qBAAqB;AAAA,gBACzB;AAAA,gBACA;AAAA,gBACA;AAAA,gBACA;AAAA,gBACA;AAAA,cACF,EAAE,SAAS,kBAAkB;AAC7B,kBAAI,CAAC,oBAAoB;AACvB,sBAAM,mBAAe,0BAAQ,SAAS,eAAe;AACrD,oBAAI,qBAAqB;AAGzB,oBAAI,iBAAiB,YAAY,GAAG;AAClC,wBAAM,gBAAY,0BAAQ,cAAc,UAAU,WAAW;AAC7D,0BAAI,2BAAW,SAAS,GAAG;AAEzB,wBAAI,CAAC,mBAAmB,SAAS,GAAG,GAAG;AACrC,4CAAsB;AAAA,oBACxB;AACA,0CAAsB,UAAU;AAChC,wBAAI,QAAQ;AACZ;AAAA,kBACF;AAAA,gBACF;AAGA,wBACE,2BAAW,eAAe,WAAW,SACrC,2BAAW,eAAe,YAAY,GACtC;AACA,wCAAsB;AACtB,sBAAI,QAAQ;AACZ;AAAA,gBACF;AAAA,cACF;AAAA,YACF;AAAA,UACF;AAAA,QACF;AAAA,MACF;AAAA,IACF;AAAA,EACF;AACF;AAEA,SAAS,iBAAiB,cAA+B;AACvD,aAAO,2BAAW,YAAY,SAAK,0BAAU,YAAY,EAAE,YAAY;AACzE;",
4
+ "mappings": ";;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,qBAAsC;AACtC,uBAA0C;AAE3B,SAAR,qBACL,KACA,SAGiB;AACjB,MAAI,cAAc,CAAC;AAEnB,SAAO;AAAA,IACL,MAAM;AAAA,IACN,SAAS;AAAA,MACP,eAAe,MAAM,OAAO;AAC1B,cAAM,SAAS,KAAK,IAAI,QAAQ;AAEhC,YACE,OAAO,aAAa,EAAE,MAAM,UAAU,CAAC,KACvC,KAAK,KAAK,UAAU,WAAW,GAC/B;AACA,gBAAM,MAAM,KAAK,KAAK,UAAU,CAAC;AACjC,cAAI,IAAI,SAAS,iBAAiB;AAChC,gBAAI,kBAAkB,IAAI;AAG1B,gBAAI,gBAAgB,WAAW,GAAG,KAAK,gBAAgB,WAAW,GAAG,GAAG;AACtE,oBAAM,WAAW,MAAM,KAAK,KAAK;AACjC,kBAAI,CAAC,SAAU;AAEf,oBAAM,cAAU,0BAAQ,QAAQ;AAChC,oBAAM,eAAe,QAAQ,sBAAsB;AACnD,oBAAM,cAAc;AAIpB,oBAAM,yBAAqB,0BAAQ,eAAe;AAClD,oBAAM,qBAAqB;AAAA,gBACzB;AAAA,gBACA;AAAA,gBACA;AAAA,gBACA;AAAA,gBACA;AAAA,cACF,EAAE,SAAS,kBAAkB;AAC7B,kBAAI,CAAC,oBAAoB;AACvB,sBAAM,mBAAe,0BAAQ,SAAS,eAAe;AACrD,oBAAI,qBAAqB;AAIzB,oBACE,aAAa,WAAW,SAAS,UAChC,2BAAW,GAAG,YAAY,SAAS,SAClC,2BAAW,GAAG,YAAY,aAAa,IACzC;AACA;AAAA,gBACF;AAGA,oBAAI,iBAAiB,YAAY,GAAG;AAClC,wBAAM,gBAAY,0BAAQ,cAAc,OAAO;AAC/C,sBACE,aAAa,WAAW,SAAS,UAChC,2BAAW,GAAG,SAAS,SAAS,SAC/B,2BAAW,GAAG,SAAS,aAAa,IACtC;AACA;AAAA,kBACF;AACA,wBAAM,gBAAY,0BAAQ,cAAc,UAAU,WAAW;AAC7D,0BAAI,2BAAW,SAAS,GAAG;AAEzB,wBAAI,CAAC,mBAAmB,SAAS,GAAG,GAAG;AACrC,4CAAsB;AAAA,oBACxB;AACA,0CAAsB,UAAU;AAChC,wBAAI,QAAQ;AACZ;AAAA,kBACF;AAAA,gBACF;AAGA,wBACE,2BAAW,eAAe,WAAW,SACrC,2BAAW,eAAe,YAAY,GACtC;AACA,wCAAsB;AACtB,sBAAI,QAAQ;AACZ;AAAA,gBACF;AAAA,cACF;AAAA,YACF;AAAA,UACF;AAAA,QACF;AAAA,MACF;AAAA,IACF;AAAA,EACF;AACF;AAEA,SAAS,iBAAiB,cAA+B;AACvD,aAAO,2BAAW,YAAY,SAAK,0BAAU,YAAY,EAAE,YAAY;AACzE;",
5
5
  "names": []
6
6
  }
@@ -2,169 +2,185 @@ var __create = Object.create
2
2
  var __defProp = Object.defineProperty
3
3
  var __getOwnPropDesc = Object.getOwnPropertyDescriptor
4
4
  var __getOwnPropNames = Object.getOwnPropertyNames
5
- var __getProtoOf = Object.getPrototypeOf,
6
- __hasOwnProp = Object.prototype.hasOwnProperty
5
+ var __getProtoOf = Object.getPrototypeOf
6
+ var __hasOwnProp = Object.prototype.hasOwnProperty
7
7
  var __export = (target, all) => {
8
- for (var name in all) __defProp(target, name, { get: all[name], enumerable: !0 })
9
- },
10
- __copyProps = (to, from, except, desc) => {
11
- if ((from && typeof from == 'object') || typeof from == 'function')
12
- for (let key of __getOwnPropNames(from))
13
- !__hasOwnProp.call(to, key) &&
14
- key !== except &&
15
- __defProp(to, key, {
16
- get: () => from[key],
17
- enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable,
18
- })
19
- return to
8
+ for (var name in all) __defProp(target, name, { get: all[name], enumerable: true })
9
+ }
10
+ var __copyProps = (to, from, except, desc) => {
11
+ if ((from && typeof from === 'object') || typeof from === 'function') {
12
+ for (let key of __getOwnPropNames(from))
13
+ if (!__hasOwnProp.call(to, key) && key !== except)
14
+ __defProp(to, key, {
15
+ get: () => from[key],
16
+ enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable,
17
+ })
20
18
  }
19
+ return to
20
+ }
21
21
  var __toESM = (mod, isNodeMode, target) => (
22
- (target = mod != null ? __create(__getProtoOf(mod)) : {}),
23
- __copyProps(
24
- // If the importer is in node compatibility mode or this is not an ESM
25
- // file that has been converted to a CommonJS file using a Babel-
26
- // compatible transform (i.e. "__esModule" has not been set), then set
27
- // "default" to the CommonJS "module.exports" for node compatibility.
28
- isNodeMode || !mod || !mod.__esModule
29
- ? __defProp(target, 'default', { value: mod, enumerable: !0 })
30
- : target,
31
- mod
32
- )
33
- ),
34
- __toCommonJS = (mod) => __copyProps(__defProp({}, '__esModule', { value: !0 }), mod)
22
+ (target = mod != null ? __create(__getProtoOf(mod)) : {}),
23
+ __copyProps(
24
+ // If the importer is in node compatibility mode or this is not an ESM
25
+ // file that has been converted to a CommonJS file using a Babel-
26
+ // compatible transform (i.e. "__esModule" has not been set), then set
27
+ // "default" to the CommonJS "module.exports" for node compatibility.
28
+ isNodeMode || !mod || !mod.__esModule
29
+ ? __defProp(target, 'default', { value: mod, enumerable: true })
30
+ : target,
31
+ mod
32
+ )
33
+ )
34
+ var __toCommonJS = (mod) => __copyProps(__defProp({}, '__esModule', { value: true }), mod)
35
35
  var index_exports = {}
36
36
  __export(index_exports, {
37
37
  default: () => FullySpecified,
38
38
  })
39
39
  module.exports = __toCommonJS(index_exports)
40
- var import_node_fs = require('node:fs'),
41
- import_node_path = require('node:path'),
42
- t = __toESM(require('@babel/types'))
40
+ var import_node_fs = require('node:fs')
41
+ var import_node_path = require('node:path')
42
+ var t = __toESM(require('@babel/types'))
43
43
  const DEFAULT_OPTIONS = {
44
- ensureFileExists: !0,
44
+ ensureFileExists: true,
45
45
  esExtensionDefault: '.mjs',
46
46
  tryExtensions: ['.js'],
47
47
  esExtensions: ['.mjs'],
48
- convertProcessEnvToImportMetaEnv: !1,
48
+ convertProcessEnvToImportMetaEnv: false,
49
49
  }
50
50
  function FullySpecified(api, rawOptions = {}) {
51
51
  api.assertVersion(7)
52
- const options = normalizeOptions(rawOptions),
53
- importDeclarationVisitor = (path, state) => {
54
- const filePath = state.file.opts.filename
55
- if (!filePath) return
56
- const { node } = path
57
- if (node.importKind === 'type') return
58
- const originalModuleSpecifier = node.source.value,
59
- fullySpecifiedModuleSpecifier = getFullySpecifiedModuleSpecifier(
60
- originalModuleSpecifier,
61
- {
62
- filePath,
63
- options,
64
- }
65
- )
66
- fullySpecifiedModuleSpecifier && (node.source.value = fullySpecifiedModuleSpecifier)
67
- },
68
- exportDeclarationVisitor = (path, state) => {
69
- const filePath = state.file.opts.filename
70
- if (!filePath) return
71
- const { node } = path
72
- if (node.exportKind === 'type') return
73
- const source = node.source
74
- if (!source) return
75
- const originalModuleSpecifier = source.value,
76
- fullySpecifiedModuleSpecifier = getFullySpecifiedModuleSpecifier(
77
- originalModuleSpecifier,
78
- {
79
- filePath,
80
- options,
81
- }
82
- )
83
- fullySpecifiedModuleSpecifier && (source.value = fullySpecifiedModuleSpecifier)
52
+ const options = normalizeOptions(rawOptions)
53
+ const importDeclarationVisitor = (path, state) => {
54
+ const filePath = state.file.opts.filename
55
+ if (!filePath) return
56
+ const { node } = path
57
+ if (node.importKind === 'type') return
58
+ const originalModuleSpecifier = node.source.value
59
+ const fullySpecifiedModuleSpecifier = getFullySpecifiedModuleSpecifier(
60
+ originalModuleSpecifier,
61
+ {
62
+ filePath,
63
+ options,
64
+ }
65
+ )
66
+ if (fullySpecifiedModuleSpecifier) {
67
+ node.source.value = fullySpecifiedModuleSpecifier
68
+ }
69
+ }
70
+ const exportDeclarationVisitor = (path, state) => {
71
+ const filePath = state.file.opts.filename
72
+ if (!filePath) return
73
+ const { node } = path
74
+ if (node.exportKind === 'type') return
75
+ const source = node.source
76
+ if (!source) return
77
+ const originalModuleSpecifier = source.value
78
+ const fullySpecifiedModuleSpecifier = getFullySpecifiedModuleSpecifier(
79
+ originalModuleSpecifier,
80
+ {
81
+ filePath,
82
+ options,
83
+ }
84
+ )
85
+ if (fullySpecifiedModuleSpecifier) {
86
+ source.value = fullySpecifiedModuleSpecifier
84
87
  }
88
+ }
89
+ const importVisitor = (path, state) => {
90
+ const filePath = state.file.opts.filename
91
+ if (!filePath) return
92
+ const parent = path.parent
93
+ if (parent.type !== 'CallExpression') {
94
+ return
95
+ }
96
+ const firstArgOfImportCall = parent.arguments[0]
97
+ if (firstArgOfImportCall.type !== 'StringLiteral') {
98
+ return
99
+ }
100
+ const originalModuleSpecifier = firstArgOfImportCall.value
101
+ const fullySpecifiedModuleSpecifier = getFullySpecifiedModuleSpecifier(
102
+ originalModuleSpecifier,
103
+ {
104
+ filePath,
105
+ options,
106
+ }
107
+ )
108
+ if (fullySpecifiedModuleSpecifier) {
109
+ firstArgOfImportCall.value = fullySpecifiedModuleSpecifier
110
+ }
111
+ }
112
+ const memberExpressionVisitor = (path) => {
113
+ if (!options.convertProcessEnvToImportMetaEnv) return
114
+ const { node } = path
115
+ if (
116
+ node.object.type === 'MemberExpression' &&
117
+ node.object.object.type === 'Identifier' &&
118
+ node.object.object.name === 'process' &&
119
+ node.object.property.type === 'Identifier' &&
120
+ node.object.property.name === 'env'
121
+ ) {
122
+ if (node.property.type === 'Identifier' && node.property.name === 'NODE_ENV') {
123
+ return
124
+ }
125
+ node.object = t.memberExpression(
126
+ t.metaProperty(t.identifier('import'), t.identifier('meta')),
127
+ t.identifier('env')
128
+ )
129
+ }
130
+ }
85
131
  return {
86
132
  name: 'babel-plugin-fully-specified',
87
133
  visitor: {
88
134
  ImportDeclaration: importDeclarationVisitor,
89
135
  ExportNamedDeclaration: exportDeclarationVisitor,
90
136
  ExportAllDeclaration: exportDeclarationVisitor,
91
- Import: (path, state) => {
92
- const filePath = state.file.opts.filename
93
- if (!filePath) return
94
- const parent = path.parent
95
- if (parent.type !== 'CallExpression') return
96
- const firstArgOfImportCall = parent.arguments[0]
97
- if (firstArgOfImportCall.type !== 'StringLiteral') return
98
- const originalModuleSpecifier = firstArgOfImportCall.value,
99
- fullySpecifiedModuleSpecifier = getFullySpecifiedModuleSpecifier(
100
- originalModuleSpecifier,
101
- {
102
- filePath,
103
- options,
104
- }
105
- )
106
- fullySpecifiedModuleSpecifier &&
107
- (firstArgOfImportCall.value = fullySpecifiedModuleSpecifier)
108
- },
109
- MemberExpression: (path) => {
110
- if (!options.convertProcessEnvToImportMetaEnv) return
111
- const { node } = path
112
- if (
113
- node.object.type === 'MemberExpression' &&
114
- node.object.object.type === 'Identifier' &&
115
- node.object.object.name === 'process' &&
116
- node.object.property.type === 'Identifier' &&
117
- node.object.property.name === 'env'
118
- ) {
119
- if (node.property.type === 'Identifier' && node.property.name === 'NODE_ENV')
120
- return
121
- node.object = t.memberExpression(
122
- t.metaProperty(t.identifier('import'), t.identifier('meta')),
123
- t.identifier('env')
124
- )
125
- }
126
- },
137
+ Import: importVisitor,
138
+ MemberExpression: memberExpressionVisitor,
127
139
  },
128
140
  }
129
141
  }
130
142
  function normalizeOptions(rawOptions) {
131
143
  const options = { ...DEFAULT_OPTIONS, ...rawOptions }
132
- return (
144
+ if (
133
145
  rawOptions.esExtensionDefault &&
134
- !rawOptions.tryExtensions &&
135
- rawOptions.esExtensionDefault !== DEFAULT_OPTIONS.esExtensionDefault &&
136
- (options.tryExtensions = [
137
- rawOptions.esExtensionDefault,
138
- ...DEFAULT_OPTIONS.tryExtensions.filter(
139
- (extension) => extension !== rawOptions.esExtensionDefault
140
- ),
141
- ]),
142
- options
143
- )
146
+ !rawOptions.tryExtensions &&
147
+ rawOptions.esExtensionDefault !== DEFAULT_OPTIONS.esExtensionDefault
148
+ ) {
149
+ options.tryExtensions = [
150
+ rawOptions.esExtensionDefault,
151
+ ...DEFAULT_OPTIONS.tryExtensions.filter(
152
+ (extension) => extension !== rawOptions.esExtensionDefault
153
+ ),
154
+ ]
155
+ }
156
+ return options
144
157
  }
145
158
  function getFullySpecifiedModuleSpecifier(
146
159
  originalModuleSpecifier,
147
160
  { filePath, options }
148
161
  ) {
149
- const fileExt = (0, import_node_path.extname)(filePath),
150
- fileDir = (0, import_node_path.dirname)(filePath),
151
- isDirectory = isLocalDirectory(
152
- (0, import_node_path.resolve)(fileDir, originalModuleSpecifier)
153
- ),
154
- currentModuleExtension = (0, import_node_path.extname)(originalModuleSpecifier),
155
- { tryExtensions, esExtensions, esExtensionDefault, ensureFileExists } = options,
156
- targetModule = evaluateTargetModule({
157
- moduleSpecifier: originalModuleSpecifier,
158
- filenameDirectory: fileDir,
159
- filenameExtension: fileExt,
160
- currentModuleExtension,
161
- isDirectory,
162
- tryExtensions,
163
- esExtensions,
164
- esExtensionDefault,
165
- ensureFileExists,
166
- })
167
- return targetModule === !1 ? null : targetModule
162
+ const fileExt = (0, import_node_path.extname)(filePath)
163
+ const fileDir = (0, import_node_path.dirname)(filePath)
164
+ const isDirectory = isLocalDirectory(
165
+ (0, import_node_path.resolve)(fileDir, originalModuleSpecifier)
166
+ )
167
+ const currentModuleExtension = (0, import_node_path.extname)(originalModuleSpecifier)
168
+ const { tryExtensions, esExtensions, esExtensionDefault, ensureFileExists } = options
169
+ const targetModule = evaluateTargetModule({
170
+ moduleSpecifier: originalModuleSpecifier,
171
+ filenameDirectory: fileDir,
172
+ filenameExtension: fileExt,
173
+ currentModuleExtension,
174
+ isDirectory,
175
+ tryExtensions,
176
+ esExtensions,
177
+ esExtensionDefault,
178
+ ensureFileExists,
179
+ })
180
+ if (targetModule === false) {
181
+ return null
182
+ }
183
+ return targetModule
168
184
  }
169
185
  function isLocalDirectory(absoluteDirectory) {
170
186
  return (
@@ -172,6 +188,15 @@ function isLocalDirectory(absoluteDirectory) {
172
188
  (0, import_node_fs.lstatSync)(absoluteDirectory).isDirectory()
173
189
  )
174
190
  }
191
+ function isNativeOutput(esExtensionDefault) {
192
+ return esExtensionDefault.startsWith('.native')
193
+ }
194
+ function hasPlatformSibling(absoluteBasePath) {
195
+ return (
196
+ (0, import_node_fs.existsSync)(`${absoluteBasePath}.ios.js`) ||
197
+ (0, import_node_fs.existsSync)(`${absoluteBasePath}.android.js`)
198
+ )
199
+ }
175
200
  function evaluateTargetModule({
176
201
  moduleSpecifier,
177
202
  currentModuleExtension,
@@ -185,25 +210,37 @@ function evaluateTargetModule({
185
210
  }) {
186
211
  const targetFile = (0, import_node_path.resolve)(filenameDirectory, moduleSpecifier)
187
212
  if (ensureFileExists) {
188
- for (const extension of tryExtensions)
189
- if ((0, import_node_fs.existsSync)(targetFile + extension))
213
+ if (isNativeOutput(esExtensionDefault) && hasPlatformSibling(targetFile)) {
214
+ return false
215
+ }
216
+ for (const extension of tryExtensions) {
217
+ if ((0, import_node_fs.existsSync)(targetFile + extension)) {
190
218
  return moduleSpecifier + esExtensionDefault
191
- if (currentModuleExtension && !esExtensions.includes(currentModuleExtension))
192
- return !1
219
+ }
220
+ }
221
+ if (currentModuleExtension && !esExtensions.includes(currentModuleExtension)) {
222
+ return false
223
+ }
193
224
  if (isDirectory) {
194
- const indexModuleSpecifier = `${moduleSpecifier.replace(/\/$/, '')}/index`,
195
- indexTargetFile = (0, import_node_path.resolve)(
196
- filenameDirectory,
197
- indexModuleSpecifier
198
- )
199
- for (const extension of tryExtensions)
200
- if ((0, import_node_fs.existsSync)(indexTargetFile + extension))
225
+ const indexModuleSpecifier = `${moduleSpecifier.replace(/\/$/, '')}/index`
226
+ const indexTargetFile = (0, import_node_path.resolve)(
227
+ filenameDirectory,
228
+ indexModuleSpecifier
229
+ )
230
+ if (isNativeOutput(esExtensionDefault) && hasPlatformSibling(indexTargetFile)) {
231
+ return false
232
+ }
233
+ for (const extension of tryExtensions) {
234
+ if ((0, import_node_fs.existsSync)(indexTargetFile + extension)) {
201
235
  return indexModuleSpecifier + esExtensionDefault
236
+ }
237
+ }
202
238
  }
203
- } else
204
- return (
205
- esExtensions.includes(filenameExtension), moduleSpecifier + esExtensionDefault
206
- )
207
- return !1
239
+ } else if (esExtensions.includes(filenameExtension)) {
240
+ return moduleSpecifier + esExtensionDefault
241
+ } else {
242
+ return moduleSpecifier + esExtensionDefault
243
+ }
244
+ return false
208
245
  }
209
246
  //# sourceMappingURL=index.js.map
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../src/index.ts"],
4
- "mappings": ";;;;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,qBAAsC,oBACtC,mBAA0C,sBAG1C,IAAmB;AAoBnB,MAAM,kBAAkB;AAAA,EACtB,kBAAkB;AAAA,EAClB,oBAAoB;AAAA,EACpB,eAAe,CAAC,KAAK;AAAA,EACrB,cAAc,CAAC,MAAM;AAAA,EACrB,kCAAkC;AACpC;AAEe,SAAR,eACL,KACA,YACW;AACX,MAAI,cAAc,CAAC;AAEnB,QAAM,UAAU,EAAE,GAAG,iBAAiB,GAAG,WAAW,GAG9C,2BAA2B,CAC/B,MACA,UACG;AACH,UAAM,WAAW,MAAM,KAAK,KAAK;AACjC,QAAI,CAAC,SAAU;AAEf,UAAM,EAAE,KAAK,IAAI;AACjB,QAAI,KAAK,eAAe,OAAQ;AAEhC,UAAM,0BAA0B,KAAK,OAAO,OACtC,gCAAgC;AAAA,MACpC;AAAA,MACA;AAAA,QACE;AAAA,QACA;AAAA,MACF;AAAA,IACF;AAEA,IAAI,kCACF,KAAK,OAAO,QAAQ;AAAA,EAExB,GAGM,2BAA2B,CAC/B,MACA,UACG;AACH,UAAM,WAAW,MAAM,KAAK,KAAK;AACjC,QAAI,CAAC,SAAU;AAEf,UAAM,EAAE,KAAK,IAAI;AACjB,QAAI,KAAK,eAAe,OAAQ;AAEhC,UAAM,SAAS,KAAK;AACpB,QAAI,CAAC,OAAQ;AAEb,UAAM,0BAA0B,OAAO,OACjC,gCAAgC;AAAA,MACpC;AAAA,MACA;AAAA,QACE;AAAA,QACA;AAAA,MACF;AAAA,IACF;AAEA,IAAI,kCACF,OAAO,QAAQ;AAAA,EAEnB;AA0DA,SAAO;AAAA,IACL,MAAM;AAAA,IACN,SAAS;AAAA,MACP,mBAAmB;AAAA,MACnB,wBAAwB;AAAA,MACxB,sBAAsB;AAAA,MACtB,QA7DkB,CAAC,MAAwB,UAAU;AACvD,cAAM,WAAW,MAAM,KAAK,KAAK;AACjC,YAAI,CAAC,SAAU;AAEf,cAAM,SAAS,KAAK;AACpB,YAAI,OAAO,SAAS;AAClB;AAGF,cAAM,uBAAuB,OAAO,UAAU,CAAC;AAC/C,YAAI,qBAAqB,SAAS;AAChC;AAGF,cAAM,0BAA0B,qBAAqB,OAC/C,gCAAgC;AAAA,UACpC;AAAA,UACA;AAAA,YACE;AAAA,YACA;AAAA,UACF;AAAA,QACF;AAEA,QAAI,kCACF,qBAAqB,QAAQ;AAAA,MAEjC;AAAA,MAoCI,kBAjC4B,CAAC,SAAqC;AACpE,YAAI,CAAC,QAAQ,iCAAkC;AAE/C,cAAM,EAAE,KAAK,IAAI;AAGjB,YACE,KAAK,OAAO,SAAS,sBACrB,KAAK,OAAO,OAAO,SAAS,gBAC5B,KAAK,OAAO,OAAO,SAAS,aAC5B,KAAK,OAAO,SAAS,SAAS,gBAC9B,KAAK,OAAO,SAAS,SAAS,OAC9B;AAEA,cAAI,KAAK,SAAS,SAAS,gBAAgB,KAAK,SAAS,SAAS;AAChE;AAIF,eAAK,SAAS,EAAE;AAAA,YACd,EAAE,aAAa,EAAE,WAAW,QAAQ,GAAG,EAAE,WAAW,MAAM,CAAC;AAAA,YAC3D,EAAE,WAAW,KAAK;AAAA,UACpB;AAAA,QACF;AAAA,MACF;AAAA,IAUE;AAAA,EACF;AACF;AAKA,SAAS,iCAMP,yBACA;AAAA,EACE;AAAA,EACA;AACF,GAUe;AACf,QAAM,cAAU,0BAAQ,QAAQ,GAC1B,cAAU,0BAAQ,QAAQ,GAE1B,cAAc,qBAAiB,0BAAQ,SAAS,uBAAuB,CAAC,GAExE,6BAAyB,0BAAQ,uBAAuB,GAExD,EAAE,eAAe,cAAc,oBAAoB,iBAAiB,IAAI,SAExE,eAAe,qBAAqB;AAAA,IACxC,iBAAiB;AAAA,IACjB,mBAAmB;AAAA,IACnB,mBAAmB;AAAA,IACnB;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF,CAAC;AAED,SAAI,iBAAiB,KACZ,OAGF;AACT;AAEA,SAAS,iBAAiB,mBAA2B;AACnD,aAAO,2BAAW,iBAAiB,SAAK,0BAAU,iBAAiB,EAAE,YAAY;AACnF;AAEA,SAAS,qBAAqB;AAAA,EAC5B;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,GAAwB;AACtB,MAAI,0BAA0B,CAAC,aAAa,SAAS,sBAAsB;AACzE,WAAO;AAGT,QAAM,iBAAa,0BAAQ,mBAAmB,eAAe;AAE7D,MAAI,kBAAkB;AACpB,eAAW,aAAa;AACtB,cAAI,2BAAW,aAAa,SAAS;AACnC,eAAO,kBAAkB;AAK7B,IACE,eACA,KAAC;AAAA,UACC;AAAA,QACE;AAAA,QACA,yBAAyB,kBAAkB,kBAAkB;AAAA,MAC/D;AAAA,IACF,MAEA,kBAAkB,GAAG,eAAe;AAAA,EAExC,MAAO,QAAI,aAAa,SAAS,iBAAiB,GACzC,kBAAkB;AAK3B,SAAO;AACT;",
4
+ "mappings": "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",
5
5
  "names": []
6
6
  }
@@ -1,5 +1,6 @@
1
1
  import { existsSync, lstatSync } from 'node:fs'
2
2
  import { dirname, extname, resolve } from 'node:path'
3
+
3
4
  function fullySpecifyCommonJS(api, options) {
4
5
  api.assertVersion(7)
5
6
  return {
@@ -8,9 +9,7 @@ function fullySpecifyCommonJS(api, options) {
8
9
  CallExpression(path, state) {
9
10
  const callee = path.get('callee')
10
11
  if (
11
- callee.isIdentifier({
12
- name: 'require',
13
- }) &&
12
+ callee.isIdentifier({ name: 'require' }) &&
14
13
  path.node.arguments.length === 1
15
14
  ) {
16
15
  const arg = path.node.arguments[0]
@@ -33,7 +32,22 @@ function fullySpecifyCommonJS(api, options) {
33
32
  if (!hasModuleExtension) {
34
33
  const resolvedPath = resolve(fileDir, moduleSpecifier)
35
34
  let newModuleSpecifier = moduleSpecifier
35
+ if (
36
+ cjsExtension.startsWith('.native') &&
37
+ (existsSync(`${resolvedPath}.ios.js`) ||
38
+ existsSync(`${resolvedPath}.android.js`))
39
+ ) {
40
+ return
41
+ }
36
42
  if (isLocalDirectory(resolvedPath)) {
43
+ const indexBase = resolve(resolvedPath, 'index')
44
+ if (
45
+ cjsExtension.startsWith('.native') &&
46
+ (existsSync(`${indexBase}.ios.js`) ||
47
+ existsSync(`${indexBase}.android.js`))
48
+ ) {
49
+ return
50
+ }
37
51
  const indexPath = resolve(resolvedPath, 'index' + jsExtension)
38
52
  if (existsSync(indexPath)) {
39
53
  if (!newModuleSpecifier.endsWith('/')) {
@@ -63,5 +77,6 @@ function fullySpecifyCommonJS(api, options) {
63
77
  function isLocalDirectory(absolutePath) {
64
78
  return existsSync(absolutePath) && lstatSync(absolutePath).isDirectory()
65
79
  }
80
+
66
81
  export { fullySpecifyCommonJS as default }
67
82
  //# sourceMappingURL=commonjs.mjs.map
@@ -1 +1 @@
1
- {"version":3,"names":["existsSync","lstatSync","dirname","extname","resolve","fullySpecifyCommonJS","api","options","assertVersion","name","visitor","CallExpression","path","state","callee","get","isIdentifier","node","arguments","length","arg","type","moduleSpecifier","value","startsWith","filePath","file","opts","filename","fileDir","cjsExtension","esExtensionDefault","jsExtension","specifierExtension","hasModuleExtension","includes","resolvedPath","newModuleSpecifier","isLocalDirectory","indexPath","endsWith","absolutePath","isDirectory"],"sources":["../../src/commonjs.ts"],"sourcesContent":[null],"mappings":"AAAA,SAASA,UAAA,EAAYC,SAAA,QAAiB;AACtC,SAASC,OAAA,EAASC,OAAA,EAASC,OAAA,QAAe;AAE3B,SAARC,qBACLC,GAAA,EACAC,OAAA,EAGiB;EACjBD,GAAA,CAAIE,aAAA,CAAc,CAAC;EAEnB,OAAO;IACLC,IAAA,EAAM;IACNC,OAAA,EAAS;MACPC,eAAeC,IAAA,EAAMC,KAAA,EAAO;QAC1B,MAAMC,MAAA,GAASF,IAAA,CAAKG,GAAA,CAAI,QAAQ;QAEhC,IACED,MAAA,CAAOE,YAAA,CAAa;UAAEP,IAAA,EAAM;QAAU,CAAC,KACvCG,IAAA,CAAKK,IAAA,CAAKC,SAAA,CAAUC,MAAA,KAAW,GAC/B;UACA,MAAMC,GAAA,GAAMR,IAAA,CAAKK,IAAA,CAAKC,SAAA,CAAU,CAAC;UACjC,IAAIE,GAAA,CAAIC,IAAA,KAAS,iBAAiB;YAChC,IAAIC,eAAA,GAAkBF,GAAA,CAAIG,KAAA;YAG1B,IAAID,eAAA,CAAgBE,UAAA,CAAW,GAAG,KAAKF,eAAA,CAAgBE,UAAA,CAAW,GAAG,GAAG;cACtE,MAAMC,QAAA,GAAWZ,KAAA,CAAMa,IAAA,CAAKC,IAAA,CAAKC,QAAA;cACjC,IAAI,CAACH,QAAA,EAAU;cAEf,MAAMI,OAAA,GAAU3B,OAAA,CAAQuB,QAAQ;cAChC,MAAMK,YAAA,GAAevB,OAAA,CAAQwB,kBAAA,IAAsB;cACnD,MAAMC,WAAA,GAAc;cAIpB,MAAMC,kBAAA,GAAqB9B,OAAA,CAAQmB,eAAe;cAClD,MAAMY,kBAAA,GAAqB,CACzB,OACA,QACA,QACA,SACA,QACF,CAAEC,QAAA,CAASF,kBAAkB;cAC7B,IAAI,CAACC,kBAAA,EAAoB;gBACvB,MAAME,YAAA,GAAehC,OAAA,CAAQyB,OAAA,EAASP,eAAe;gBACrD,IAAIe,kBAAA,GAAqBf,eAAA;gBAGzB,IAAIgB,gBAAA,CAAiBF,YAAY,GAAG;kBAClC,MAAMG,SAAA,GAAYnC,OAAA,CAAQgC,YAAA,EAAc,UAAUJ,WAAW;kBAC7D,IAAIhC,UAAA,CAAWuC,SAAS,GAAG;oBAEzB,IAAI,CAACF,kBAAA,CAAmBG,QAAA,CAAS,GAAG,GAAG;sBACrCH,kBAAA,IAAsB;oBACxB;oBACAA,kBAAA,IAAsB,UAAUP,YAAA;oBAChCV,GAAA,CAAIG,KAAA,GAAQc,kBAAA;oBACZ;kBACF;gBACF;gBAGA,IACErC,UAAA,CAAWoC,YAAA,GAAeJ,WAAW,KACrChC,UAAA,CAAWoC,YAAA,GAAeN,YAAY,GACtC;kBACAO,kBAAA,IAAsBP,YAAA;kBACtBV,GAAA,CAAIG,KAAA,GAAQc,kBAAA;kBACZ;gBACF;cACF;YACF;UACF;QACF;MACF;IACF;EACF;AACF;AAEA,SAASC,iBAAiBG,YAAA,EAA+B;EACvD,OAAOzC,UAAA,CAAWyC,YAAY,KAAKxC,SAAA,CAAUwC,YAAY,EAAEC,WAAA,CAAY;AACzE","ignoreList":[]}
1
+ {"version":3,"file":"commonjs.js","names":[],"sources":["esm/commonjs.js"],"sourcesContent":["import { existsSync, lstatSync } from \"node:fs\";\nimport { dirname, extname, resolve } from \"node:path\";\nfunction fullySpecifyCommonJS(api, options) {\n api.assertVersion(7);\n return {\n name: \"babel-plugin-fully-specified-cjs\",\n visitor: {\n CallExpression(path, state) {\n const callee = path.get(\"callee\");\n if (callee.isIdentifier({ name: \"require\" }) && path.node.arguments.length === 1) {\n const arg = path.node.arguments[0];\n if (arg.type === \"StringLiteral\") {\n let moduleSpecifier = arg.value;\n if (moduleSpecifier.startsWith(\".\") || moduleSpecifier.startsWith(\"/\")) {\n const filePath = state.file.opts.filename;\n if (!filePath) return;\n const fileDir = dirname(filePath);\n const cjsExtension = options.esExtensionDefault || \".cjs\";\n const jsExtension = \".js\";\n const specifierExtension = extname(moduleSpecifier);\n const hasModuleExtension = [\n \".js\",\n \".cjs\",\n \".mjs\",\n \".json\",\n \".node\"\n ].includes(specifierExtension);\n if (!hasModuleExtension) {\n const resolvedPath = resolve(fileDir, moduleSpecifier);\n let newModuleSpecifier = moduleSpecifier;\n if (cjsExtension.startsWith(\".native\") && (existsSync(`${resolvedPath}.ios.js`) || existsSync(`${resolvedPath}.android.js`))) {\n return;\n }\n if (isLocalDirectory(resolvedPath)) {\n const indexBase = resolve(resolvedPath, \"index\");\n if (cjsExtension.startsWith(\".native\") && (existsSync(`${indexBase}.ios.js`) || existsSync(`${indexBase}.android.js`))) {\n return;\n }\n const indexPath = resolve(resolvedPath, \"index\" + jsExtension);\n if (existsSync(indexPath)) {\n if (!newModuleSpecifier.endsWith(\"/\")) {\n newModuleSpecifier += \"/\";\n }\n newModuleSpecifier += \"index\" + cjsExtension;\n arg.value = newModuleSpecifier;\n return;\n }\n }\n if (existsSync(resolvedPath + jsExtension) || existsSync(resolvedPath + cjsExtension)) {\n newModuleSpecifier += cjsExtension;\n arg.value = newModuleSpecifier;\n return;\n }\n }\n }\n }\n }\n }\n }\n };\n}\nfunction isLocalDirectory(absolutePath) {\n return existsSync(absolutePath) && lstatSync(absolutePath).isDirectory();\n}\nexport {\n fullySpecifyCommonJS as default\n};\n//# sourceMappingURL=commonjs.js.map\n"],"mappings":";;;;AAEA,SAAS,qBAAqB,KAAK,SAAS;CAC1C,IAAI,cAAc,CAAC;CACnB,OAAO;EACL,MAAM;EACN,SAAS,EACP,eAAe,MAAM,OAAO;GAC1B,MAAM,SAAS,KAAK,IAAI,QAAQ;GAChC,IAAI,OAAO,aAAa,EAAE,MAAM,UAAU,CAAC,KAAK,KAAK,KAAK,UAAU,WAAW,GAAG;IAChF,MAAM,MAAM,KAAK,KAAK,UAAU;IAChC,IAAI,IAAI,SAAS,iBAAiB;KAChC,IAAI,kBAAkB,IAAI;KAC1B,IAAI,gBAAgB,WAAW,GAAG,KAAK,gBAAgB,WAAW,GAAG,GAAG;MACtE,MAAM,WAAW,MAAM,KAAK,KAAK;MACjC,IAAI,CAAC,UAAU;MACf,MAAM,UAAU,QAAQ,QAAQ;MAChC,MAAM,eAAe,QAAQ,sBAAsB;MACnD,MAAM,cAAc;MACpB,MAAM,qBAAqB,QAAQ,eAAe;MAClD,MAAM,qBAAqB;OACzB;OACA;OACA;OACA;OACA;MACF,CAAC,CAAC,SAAS,kBAAkB;MAC7B,IAAI,CAAC,oBAAoB;OACvB,MAAM,eAAe,QAAQ,SAAS,eAAe;OACrD,IAAI,qBAAqB;OACzB,IAAI,aAAa,WAAW,SAAS,MAAM,WAAW,GAAG,aAAa,QAAQ,KAAK,WAAW,GAAG,aAAa,YAAY,IAAI;QAC5H;OACF;OACA,IAAI,iBAAiB,YAAY,GAAG;QAClC,MAAM,YAAY,QAAQ,cAAc,OAAO;QAC/C,IAAI,aAAa,WAAW,SAAS,MAAM,WAAW,GAAG,UAAU,QAAQ,KAAK,WAAW,GAAG,UAAU,YAAY,IAAI;SACtH;QACF;QACA,MAAM,YAAY,QAAQ,cAAc,UAAU,WAAW;QAC7D,IAAI,WAAW,SAAS,GAAG;SACzB,IAAI,CAAC,mBAAmB,SAAS,GAAG,GAAG;UACrC,sBAAsB;SACxB;SACA,sBAAsB,UAAU;SAChC,IAAI,QAAQ;SACZ;QACF;OACF;OACA,IAAI,WAAW,eAAe,WAAW,KAAK,WAAW,eAAe,YAAY,GAAG;QACrF,sBAAsB;QACtB,IAAI,QAAQ;QACZ;OACF;MACF;KACF;IACF;GACF;EACF,EACF;CACF;AACF;AACA,SAAS,iBAAiB,cAAc;CACtC,OAAO,WAAW,YAAY,KAAK,UAAU,YAAY,CAAC,CAAC,YAAY;AACzE"}
@@ -1,133 +1,162 @@
1
1
  import { existsSync, lstatSync } from 'node:fs'
2
2
  import { dirname, extname, resolve } from 'node:path'
3
3
  import * as t from '@babel/types'
4
+
4
5
  const DEFAULT_OPTIONS = {
5
- ensureFileExists: !0,
6
+ ensureFileExists: true,
6
7
  esExtensionDefault: '.mjs',
7
8
  tryExtensions: ['.js'],
8
9
  esExtensions: ['.mjs'],
9
- convertProcessEnvToImportMetaEnv: !1,
10
+ convertProcessEnvToImportMetaEnv: false,
10
11
  }
11
12
  function FullySpecified(api, rawOptions = {}) {
12
13
  api.assertVersion(7)
13
- const options = normalizeOptions(rawOptions),
14
- importDeclarationVisitor = (path, state) => {
15
- const filePath = state.file.opts.filename
16
- if (!filePath) return
17
- const { node } = path
18
- if (node.importKind === 'type') return
19
- const originalModuleSpecifier = node.source.value,
20
- fullySpecifiedModuleSpecifier = getFullySpecifiedModuleSpecifier(
21
- originalModuleSpecifier,
22
- {
23
- filePath,
24
- options,
25
- }
26
- )
27
- fullySpecifiedModuleSpecifier && (node.source.value = fullySpecifiedModuleSpecifier)
28
- },
29
- exportDeclarationVisitor = (path, state) => {
30
- const filePath = state.file.opts.filename
31
- if (!filePath) return
32
- const { node } = path
33
- if (node.exportKind === 'type') return
34
- const source = node.source
35
- if (!source) return
36
- const originalModuleSpecifier = source.value,
37
- fullySpecifiedModuleSpecifier = getFullySpecifiedModuleSpecifier(
38
- originalModuleSpecifier,
39
- {
40
- filePath,
41
- options,
42
- }
43
- )
44
- fullySpecifiedModuleSpecifier && (source.value = fullySpecifiedModuleSpecifier)
14
+ const options = normalizeOptions(rawOptions)
15
+ const importDeclarationVisitor = (path, state) => {
16
+ const filePath = state.file.opts.filename
17
+ if (!filePath) return
18
+ const { node } = path
19
+ if (node.importKind === 'type') return
20
+ const originalModuleSpecifier = node.source.value
21
+ const fullySpecifiedModuleSpecifier = getFullySpecifiedModuleSpecifier(
22
+ originalModuleSpecifier,
23
+ {
24
+ filePath,
25
+ options,
26
+ }
27
+ )
28
+ if (fullySpecifiedModuleSpecifier) {
29
+ node.source.value = fullySpecifiedModuleSpecifier
30
+ }
31
+ }
32
+ const exportDeclarationVisitor = (path, state) => {
33
+ const filePath = state.file.opts.filename
34
+ if (!filePath) return
35
+ const { node } = path
36
+ if (node.exportKind === 'type') return
37
+ const source = node.source
38
+ if (!source) return
39
+ const originalModuleSpecifier = source.value
40
+ const fullySpecifiedModuleSpecifier = getFullySpecifiedModuleSpecifier(
41
+ originalModuleSpecifier,
42
+ {
43
+ filePath,
44
+ options,
45
+ }
46
+ )
47
+ if (fullySpecifiedModuleSpecifier) {
48
+ source.value = fullySpecifiedModuleSpecifier
49
+ }
50
+ }
51
+ const importVisitor = (path, state) => {
52
+ const filePath = state.file.opts.filename
53
+ if (!filePath) return
54
+ const parent = path.parent
55
+ if (parent.type !== 'CallExpression') {
56
+ return
57
+ }
58
+ const firstArgOfImportCall = parent.arguments[0]
59
+ if (firstArgOfImportCall.type !== 'StringLiteral') {
60
+ return
45
61
  }
62
+ const originalModuleSpecifier = firstArgOfImportCall.value
63
+ const fullySpecifiedModuleSpecifier = getFullySpecifiedModuleSpecifier(
64
+ originalModuleSpecifier,
65
+ {
66
+ filePath,
67
+ options,
68
+ }
69
+ )
70
+ if (fullySpecifiedModuleSpecifier) {
71
+ firstArgOfImportCall.value = fullySpecifiedModuleSpecifier
72
+ }
73
+ }
74
+ const memberExpressionVisitor = (path) => {
75
+ if (!options.convertProcessEnvToImportMetaEnv) return
76
+ const { node } = path
77
+ if (
78
+ node.object.type === 'MemberExpression' &&
79
+ node.object.object.type === 'Identifier' &&
80
+ node.object.object.name === 'process' &&
81
+ node.object.property.type === 'Identifier' &&
82
+ node.object.property.name === 'env'
83
+ ) {
84
+ if (node.property.type === 'Identifier' && node.property.name === 'NODE_ENV') {
85
+ return
86
+ }
87
+ node.object = t.memberExpression(
88
+ t.metaProperty(t.identifier('import'), t.identifier('meta')),
89
+ t.identifier('env')
90
+ )
91
+ }
92
+ }
46
93
  return {
47
94
  name: 'babel-plugin-fully-specified',
48
95
  visitor: {
49
96
  ImportDeclaration: importDeclarationVisitor,
50
97
  ExportNamedDeclaration: exportDeclarationVisitor,
51
98
  ExportAllDeclaration: exportDeclarationVisitor,
52
- Import: (path, state) => {
53
- const filePath = state.file.opts.filename
54
- if (!filePath) return
55
- const parent = path.parent
56
- if (parent.type !== 'CallExpression') return
57
- const firstArgOfImportCall = parent.arguments[0]
58
- if (firstArgOfImportCall.type !== 'StringLiteral') return
59
- const originalModuleSpecifier = firstArgOfImportCall.value,
60
- fullySpecifiedModuleSpecifier = getFullySpecifiedModuleSpecifier(
61
- originalModuleSpecifier,
62
- {
63
- filePath,
64
- options,
65
- }
66
- )
67
- fullySpecifiedModuleSpecifier &&
68
- (firstArgOfImportCall.value = fullySpecifiedModuleSpecifier)
69
- },
70
- MemberExpression: (path) => {
71
- if (!options.convertProcessEnvToImportMetaEnv) return
72
- const { node } = path
73
- if (
74
- node.object.type === 'MemberExpression' &&
75
- node.object.object.type === 'Identifier' &&
76
- node.object.object.name === 'process' &&
77
- node.object.property.type === 'Identifier' &&
78
- node.object.property.name === 'env'
79
- ) {
80
- if (node.property.type === 'Identifier' && node.property.name === 'NODE_ENV')
81
- return
82
- node.object = t.memberExpression(
83
- t.metaProperty(t.identifier('import'), t.identifier('meta')),
84
- t.identifier('env')
85
- )
86
- }
87
- },
99
+ Import: importVisitor,
100
+ MemberExpression: memberExpressionVisitor,
88
101
  },
89
102
  }
90
103
  }
91
104
  function normalizeOptions(rawOptions) {
92
- const options = { ...DEFAULT_OPTIONS, ...rawOptions }
93
- return (
105
+ const options = {
106
+ ...DEFAULT_OPTIONS,
107
+ ...rawOptions,
108
+ }
109
+ if (
94
110
  rawOptions.esExtensionDefault &&
95
- !rawOptions.tryExtensions &&
96
- rawOptions.esExtensionDefault !== DEFAULT_OPTIONS.esExtensionDefault &&
97
- (options.tryExtensions = [
98
- rawOptions.esExtensionDefault,
99
- ...DEFAULT_OPTIONS.tryExtensions.filter(
100
- (extension) => extension !== rawOptions.esExtensionDefault
101
- ),
102
- ]),
103
- options
104
- )
111
+ !rawOptions.tryExtensions &&
112
+ rawOptions.esExtensionDefault !== DEFAULT_OPTIONS.esExtensionDefault
113
+ ) {
114
+ options.tryExtensions = [
115
+ rawOptions.esExtensionDefault,
116
+ ...DEFAULT_OPTIONS.tryExtensions.filter(
117
+ (extension) => extension !== rawOptions.esExtensionDefault
118
+ ),
119
+ ]
120
+ }
121
+ return options
105
122
  }
106
123
  function getFullySpecifiedModuleSpecifier(
107
124
  originalModuleSpecifier,
108
125
  { filePath, options }
109
126
  ) {
110
- const fileExt = extname(filePath),
111
- fileDir = dirname(filePath),
112
- isDirectory = isLocalDirectory(resolve(fileDir, originalModuleSpecifier)),
113
- currentModuleExtension = extname(originalModuleSpecifier),
114
- { tryExtensions, esExtensions, esExtensionDefault, ensureFileExists } = options,
115
- targetModule = evaluateTargetModule({
116
- moduleSpecifier: originalModuleSpecifier,
117
- filenameDirectory: fileDir,
118
- filenameExtension: fileExt,
119
- currentModuleExtension,
120
- isDirectory,
121
- tryExtensions,
122
- esExtensions,
123
- esExtensionDefault,
124
- ensureFileExists,
125
- })
126
- return targetModule === !1 ? null : targetModule
127
+ const fileExt = extname(filePath)
128
+ const fileDir = dirname(filePath)
129
+ const isDirectory = isLocalDirectory(resolve(fileDir, originalModuleSpecifier))
130
+ const currentModuleExtension = extname(originalModuleSpecifier)
131
+ const { tryExtensions, esExtensions, esExtensionDefault, ensureFileExists } = options
132
+ const targetModule = evaluateTargetModule({
133
+ moduleSpecifier: originalModuleSpecifier,
134
+ filenameDirectory: fileDir,
135
+ filenameExtension: fileExt,
136
+ currentModuleExtension,
137
+ isDirectory,
138
+ tryExtensions,
139
+ esExtensions,
140
+ esExtensionDefault,
141
+ ensureFileExists,
142
+ })
143
+ if (targetModule === false) {
144
+ return null
145
+ }
146
+ return targetModule
127
147
  }
128
148
  function isLocalDirectory(absoluteDirectory) {
129
149
  return existsSync(absoluteDirectory) && lstatSync(absoluteDirectory).isDirectory()
130
150
  }
151
+ function isNativeOutput(esExtensionDefault) {
152
+ return esExtensionDefault.startsWith('.native')
153
+ }
154
+ function hasPlatformSibling(absoluteBasePath) {
155
+ return (
156
+ existsSync(`${absoluteBasePath}.ios.js`) ||
157
+ existsSync(`${absoluteBasePath}.android.js`)
158
+ )
159
+ }
131
160
  function evaluateTargetModule({
132
161
  moduleSpecifier,
133
162
  currentModuleExtension,
@@ -141,22 +170,36 @@ function evaluateTargetModule({
141
170
  }) {
142
171
  const targetFile = resolve(filenameDirectory, moduleSpecifier)
143
172
  if (ensureFileExists) {
144
- for (const extension of tryExtensions)
145
- if (existsSync(targetFile + extension)) return moduleSpecifier + esExtensionDefault
146
- if (currentModuleExtension && !esExtensions.includes(currentModuleExtension))
147
- return !1
173
+ if (isNativeOutput(esExtensionDefault) && hasPlatformSibling(targetFile)) {
174
+ return false
175
+ }
176
+ for (const extension of tryExtensions) {
177
+ if (existsSync(targetFile + extension)) {
178
+ return moduleSpecifier + esExtensionDefault
179
+ }
180
+ }
181
+ if (currentModuleExtension && !esExtensions.includes(currentModuleExtension)) {
182
+ return false
183
+ }
148
184
  if (isDirectory) {
149
- const indexModuleSpecifier = `${moduleSpecifier.replace(/\/$/, '')}/index`,
150
- indexTargetFile = resolve(filenameDirectory, indexModuleSpecifier)
151
- for (const extension of tryExtensions)
152
- if (existsSync(indexTargetFile + extension))
185
+ const indexModuleSpecifier = `${moduleSpecifier.replace(/\/$/, '')}/index`
186
+ const indexTargetFile = resolve(filenameDirectory, indexModuleSpecifier)
187
+ if (isNativeOutput(esExtensionDefault) && hasPlatformSibling(indexTargetFile)) {
188
+ return false
189
+ }
190
+ for (const extension of tryExtensions) {
191
+ if (existsSync(indexTargetFile + extension)) {
153
192
  return indexModuleSpecifier + esExtensionDefault
193
+ }
194
+ }
154
195
  }
155
- } else
156
- return (
157
- esExtensions.includes(filenameExtension), moduleSpecifier + esExtensionDefault
158
- )
159
- return !1
196
+ } else if (esExtensions.includes(filenameExtension)) {
197
+ return moduleSpecifier + esExtensionDefault
198
+ } else {
199
+ return moduleSpecifier + esExtensionDefault
200
+ }
201
+ return false
160
202
  }
203
+
161
204
  export { FullySpecified as default }
162
205
  //# sourceMappingURL=index.mjs.map
@@ -1 +1 @@
1
- {"version":3,"names":["existsSync","lstatSync","dirname","extname","resolve","t","DEFAULT_OPTIONS","ensureFileExists","esExtensionDefault","tryExtensions","esExtensions","convertProcessEnvToImportMetaEnv","FullySpecified","api","rawOptions","assertVersion","options","importDeclarationVisitor","path","state","filePath","file","opts","filename","node","importKind","originalModuleSpecifier","source","value","fullySpecifiedModuleSpecifier","getFullySpecifiedModuleSpecifier","exportDeclarationVisitor","exportKind","name","visitor","ImportDeclaration","ExportNamedDeclaration","ExportAllDeclaration","Import","parent","type","firstArgOfImportCall","arguments","MemberExpression","object","property","memberExpression","metaProperty","identifier","fileExt","fileDir","isDirectory","isLocalDirectory","currentModuleExtension","targetModule","evaluateTargetModule","moduleSpecifier","filenameDirectory","filenameExtension","absoluteDirectory","includes","targetFile","extension"],"sources":["../../src/index.ts"],"sourcesContent":[null],"mappings":"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","ignoreList":[]}
1
+ {"version":3,"file":"index.js","names":[],"sources":["esm/index.js"],"sourcesContent":["import { existsSync, lstatSync } from \"node:fs\";\nimport { dirname, extname, resolve } from \"node:path\";\nimport * as t from \"@babel/types\";\nconst DEFAULT_OPTIONS = {\n ensureFileExists: true,\n esExtensionDefault: \".mjs\",\n tryExtensions: [\".js\"],\n esExtensions: [\".mjs\"],\n convertProcessEnvToImportMetaEnv: false\n};\nfunction FullySpecified(api, rawOptions = {}) {\n api.assertVersion(7);\n const options = normalizeOptions(rawOptions);\n const importDeclarationVisitor = (path, state) => {\n const filePath = state.file.opts.filename;\n if (!filePath) return;\n const { node } = path;\n if (node.importKind === \"type\") return;\n const originalModuleSpecifier = node.source.value;\n const fullySpecifiedModuleSpecifier = getFullySpecifiedModuleSpecifier(\n originalModuleSpecifier,\n {\n filePath,\n options\n }\n );\n if (fullySpecifiedModuleSpecifier) {\n node.source.value = fullySpecifiedModuleSpecifier;\n }\n };\n const exportDeclarationVisitor = (path, state) => {\n const filePath = state.file.opts.filename;\n if (!filePath) return;\n const { node } = path;\n if (node.exportKind === \"type\") return;\n const source = node.source;\n if (!source) return;\n const originalModuleSpecifier = source.value;\n const fullySpecifiedModuleSpecifier = getFullySpecifiedModuleSpecifier(\n originalModuleSpecifier,\n {\n filePath,\n options\n }\n );\n if (fullySpecifiedModuleSpecifier) {\n source.value = fullySpecifiedModuleSpecifier;\n }\n };\n const importVisitor = (path, state) => {\n const filePath = state.file.opts.filename;\n if (!filePath) return;\n const parent = path.parent;\n if (parent.type !== \"CallExpression\") {\n return;\n }\n const firstArgOfImportCall = parent.arguments[0];\n if (firstArgOfImportCall.type !== \"StringLiteral\") {\n return;\n }\n const originalModuleSpecifier = firstArgOfImportCall.value;\n const fullySpecifiedModuleSpecifier = getFullySpecifiedModuleSpecifier(\n originalModuleSpecifier,\n {\n filePath,\n options\n }\n );\n if (fullySpecifiedModuleSpecifier) {\n firstArgOfImportCall.value = fullySpecifiedModuleSpecifier;\n }\n };\n const memberExpressionVisitor = (path) => {\n if (!options.convertProcessEnvToImportMetaEnv) return;\n const { node } = path;\n if (node.object.type === \"MemberExpression\" && node.object.object.type === \"Identifier\" && node.object.object.name === \"process\" && node.object.property.type === \"Identifier\" && node.object.property.name === \"env\") {\n if (node.property.type === \"Identifier\" && node.property.name === \"NODE_ENV\") {\n return;\n }\n node.object = t.memberExpression(\n t.metaProperty(t.identifier(\"import\"), t.identifier(\"meta\")),\n t.identifier(\"env\")\n );\n }\n };\n return {\n name: \"babel-plugin-fully-specified\",\n visitor: {\n ImportDeclaration: importDeclarationVisitor,\n ExportNamedDeclaration: exportDeclarationVisitor,\n ExportAllDeclaration: exportDeclarationVisitor,\n Import: importVisitor,\n MemberExpression: memberExpressionVisitor\n }\n };\n}\nfunction normalizeOptions(rawOptions) {\n const options = { ...DEFAULT_OPTIONS, ...rawOptions };\n if (rawOptions.esExtensionDefault && !rawOptions.tryExtensions && rawOptions.esExtensionDefault !== DEFAULT_OPTIONS.esExtensionDefault) {\n options.tryExtensions = [\n rawOptions.esExtensionDefault,\n ...DEFAULT_OPTIONS.tryExtensions.filter(\n (extension) => extension !== rawOptions.esExtensionDefault\n )\n ];\n }\n return options;\n}\nfunction getFullySpecifiedModuleSpecifier(originalModuleSpecifier, {\n filePath,\n options\n}) {\n const fileExt = extname(filePath);\n const fileDir = dirname(filePath);\n const isDirectory = isLocalDirectory(resolve(fileDir, originalModuleSpecifier));\n const currentModuleExtension = extname(originalModuleSpecifier);\n const { tryExtensions, esExtensions, esExtensionDefault, ensureFileExists } = options;\n const targetModule = evaluateTargetModule({\n moduleSpecifier: originalModuleSpecifier,\n filenameDirectory: fileDir,\n filenameExtension: fileExt,\n currentModuleExtension,\n isDirectory,\n tryExtensions,\n esExtensions,\n esExtensionDefault,\n ensureFileExists\n });\n if (targetModule === false) {\n return null;\n }\n return targetModule;\n}\nfunction isLocalDirectory(absoluteDirectory) {\n return existsSync(absoluteDirectory) && lstatSync(absoluteDirectory).isDirectory();\n}\nfunction isNativeOutput(esExtensionDefault) {\n return esExtensionDefault.startsWith(\".native\");\n}\nfunction hasPlatformSibling(absoluteBasePath) {\n return existsSync(`${absoluteBasePath}.ios.js`) || existsSync(`${absoluteBasePath}.android.js`);\n}\nfunction evaluateTargetModule({\n moduleSpecifier,\n currentModuleExtension,\n isDirectory,\n filenameDirectory,\n filenameExtension,\n tryExtensions,\n esExtensions,\n esExtensionDefault,\n ensureFileExists\n}) {\n const targetFile = resolve(filenameDirectory, moduleSpecifier);\n if (ensureFileExists) {\n if (isNativeOutput(esExtensionDefault) && hasPlatformSibling(targetFile)) {\n return false;\n }\n for (const extension of tryExtensions) {\n if (existsSync(targetFile + extension)) {\n return moduleSpecifier + esExtensionDefault;\n }\n }\n if (currentModuleExtension && !esExtensions.includes(currentModuleExtension)) {\n return false;\n }\n if (isDirectory) {\n const indexModuleSpecifier = `${moduleSpecifier.replace(/\\/$/, \"\")}/index`;\n const indexTargetFile = resolve(filenameDirectory, indexModuleSpecifier);\n if (isNativeOutput(esExtensionDefault) && hasPlatformSibling(indexTargetFile)) {\n return false;\n }\n for (const extension of tryExtensions) {\n if (existsSync(indexTargetFile + extension)) {\n return indexModuleSpecifier + esExtensionDefault;\n }\n }\n }\n } else if (esExtensions.includes(filenameExtension)) {\n return moduleSpecifier + esExtensionDefault;\n } else {\n return moduleSpecifier + esExtensionDefault;\n }\n return false;\n}\nexport {\n FullySpecified as default\n};\n//# sourceMappingURL=index.js.map\n"],"mappings":"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"}
package/src/commonjs.ts CHANGED
@@ -46,8 +46,26 @@ export default function fullySpecifyCommonJS(
46
46
  const resolvedPath = resolve(fileDir, moduleSpecifier)
47
47
  let newModuleSpecifier = moduleSpecifier
48
48
 
49
+ // native outputs keep platform-split modules extensionless so
50
+ // the react native bundler resolves .ios/.android over .native
51
+ if (
52
+ cjsExtension.startsWith('.native') &&
53
+ (existsSync(`${resolvedPath}.ios.js`) ||
54
+ existsSync(`${resolvedPath}.android.js`))
55
+ ) {
56
+ return
57
+ }
58
+
49
59
  // Check if the moduleSpecifier is a directory with an index.cjs file
50
60
  if (isLocalDirectory(resolvedPath)) {
61
+ const indexBase = resolve(resolvedPath, 'index')
62
+ if (
63
+ cjsExtension.startsWith('.native') &&
64
+ (existsSync(`${indexBase}.ios.js`) ||
65
+ existsSync(`${indexBase}.android.js`))
66
+ ) {
67
+ return
68
+ }
51
69
  const indexPath = resolve(resolvedPath, 'index' + jsExtension)
52
70
  if (existsSync(indexPath)) {
53
71
  // Append '/' if not present
package/src/index.ts CHANGED
@@ -236,6 +236,19 @@ function isLocalDirectory(absoluteDirectory: string) {
236
236
  return existsSync(absoluteDirectory) && lstatSync(absoluteDirectory).isDirectory()
237
237
  }
238
238
 
239
+ // native outputs keep platform-split modules extensionless so the react
240
+ // native bundler resolves .ios/.android over .native at bundle time
241
+ function isNativeOutput(esExtensionDefault: string) {
242
+ return esExtensionDefault.startsWith('.native')
243
+ }
244
+
245
+ function hasPlatformSibling(absoluteBasePath: string) {
246
+ return (
247
+ existsSync(`${absoluteBasePath}.ios.js`) ||
248
+ existsSync(`${absoluteBasePath}.android.js`)
249
+ )
250
+ }
251
+
239
252
  function evaluateTargetModule({
240
253
  moduleSpecifier,
241
254
  currentModuleExtension,
@@ -250,6 +263,10 @@ function evaluateTargetModule({
250
263
  const targetFile = resolve(filenameDirectory, moduleSpecifier)
251
264
 
252
265
  if (ensureFileExists) {
266
+ if (isNativeOutput(esExtensionDefault) && hasPlatformSibling(targetFile)) {
267
+ return false
268
+ }
269
+
253
270
  for (const extension of tryExtensions) {
254
271
  if (existsSync(targetFile + extension)) {
255
272
  return moduleSpecifier + esExtensionDefault
@@ -264,6 +281,10 @@ function evaluateTargetModule({
264
281
  const indexModuleSpecifier = `${moduleSpecifier.replace(/\/$/, '')}/index`
265
282
  const indexTargetFile = resolve(filenameDirectory, indexModuleSpecifier)
266
283
 
284
+ if (isNativeOutput(esExtensionDefault) && hasPlatformSibling(indexTargetFile)) {
285
+ return false
286
+ }
287
+
267
288
  for (const extension of tryExtensions) {
268
289
  if (existsSync(indexTargetFile + extension)) {
269
290
  return indexModuleSpecifier + esExtensionDefault
@@ -6,6 +6,6 @@
6
6
  ],
7
7
  "version": 3,
8
8
  "sourcesContent": [
9
- "import { existsSync, lstatSync } from 'node:fs'\nimport { dirname, extname, resolve } from 'node:path'\n\nexport default function fullySpecifyCommonJS(\n api: any,\n options: {\n esExtensionDefault: string\n }\n): babel.PluginObj {\n api.assertVersion(7)\n\n return {\n name: 'babel-plugin-fully-specified-cjs',\n visitor: {\n CallExpression(path, state) {\n const callee = path.get('callee')\n\n if (\n callee.isIdentifier({ name: 'require' }) &&\n path.node.arguments.length === 1\n ) {\n const arg = path.node.arguments[0]\n if (arg.type === 'StringLiteral') {\n let moduleSpecifier = arg.value\n\n // Skip built-in modules and node_modules\n if (moduleSpecifier.startsWith('.') || moduleSpecifier.startsWith('/')) {\n const filePath = state.file.opts.filename\n if (!filePath) return // Cannot determine file path\n\n const fileDir = dirname(filePath)\n const cjsExtension = options.esExtensionDefault || '.cjs'\n const jsExtension = '.js'\n\n // Check if moduleSpecifier already has a module extension. extname alone\n // is wrong here: dotted basenames like ./foo.generated have no extension.\n const specifierExtension = extname(moduleSpecifier)\n const hasModuleExtension = [\n '.js',\n '.cjs',\n '.mjs',\n '.json',\n '.node',\n ].includes(specifierExtension)\n if (!hasModuleExtension) {\n const resolvedPath = resolve(fileDir, moduleSpecifier)\n let newModuleSpecifier = moduleSpecifier\n\n // Check if the moduleSpecifier is a directory with an index.cjs file\n if (isLocalDirectory(resolvedPath)) {\n const indexPath = resolve(resolvedPath, 'index' + jsExtension)\n if (existsSync(indexPath)) {\n // Append '/' if not present\n if (!newModuleSpecifier.endsWith('/')) {\n newModuleSpecifier += '/'\n }\n newModuleSpecifier += 'index' + cjsExtension\n arg.value = newModuleSpecifier\n return\n }\n }\n\n // Check if source file exists (try .js first, then target extension)\n if (\n existsSync(resolvedPath + jsExtension) ||\n existsSync(resolvedPath + cjsExtension)\n ) {\n newModuleSpecifier += cjsExtension\n arg.value = newModuleSpecifier\n return\n }\n }\n }\n }\n }\n },\n },\n } satisfies babel.PluginObj\n}\n\nfunction isLocalDirectory(absolutePath: string): boolean {\n return existsSync(absolutePath) && lstatSync(absolutePath).isDirectory()\n}\n"
9
+ "import { existsSync, lstatSync } from 'node:fs'\nimport { dirname, extname, resolve } from 'node:path'\n\nexport default function fullySpecifyCommonJS(\n api: any,\n options: {\n esExtensionDefault: string\n }\n): babel.PluginObj {\n api.assertVersion(7)\n\n return {\n name: 'babel-plugin-fully-specified-cjs',\n visitor: {\n CallExpression(path, state) {\n const callee = path.get('callee')\n\n if (\n callee.isIdentifier({ name: 'require' }) &&\n path.node.arguments.length === 1\n ) {\n const arg = path.node.arguments[0]\n if (arg.type === 'StringLiteral') {\n let moduleSpecifier = arg.value\n\n // Skip built-in modules and node_modules\n if (moduleSpecifier.startsWith('.') || moduleSpecifier.startsWith('/')) {\n const filePath = state.file.opts.filename\n if (!filePath) return // Cannot determine file path\n\n const fileDir = dirname(filePath)\n const cjsExtension = options.esExtensionDefault || '.cjs'\n const jsExtension = '.js'\n\n // Check if moduleSpecifier already has a module extension. extname alone\n // is wrong here: dotted basenames like ./foo.generated have no extension.\n const specifierExtension = extname(moduleSpecifier)\n const hasModuleExtension = [\n '.js',\n '.cjs',\n '.mjs',\n '.json',\n '.node',\n ].includes(specifierExtension)\n if (!hasModuleExtension) {\n const resolvedPath = resolve(fileDir, moduleSpecifier)\n let newModuleSpecifier = moduleSpecifier\n\n // native outputs keep platform-split modules extensionless so\n // the react native bundler resolves .ios/.android over .native\n if (\n cjsExtension.startsWith('.native') &&\n (existsSync(`${resolvedPath}.ios.js`) ||\n existsSync(`${resolvedPath}.android.js`))\n ) {\n return\n }\n\n // Check if the moduleSpecifier is a directory with an index.cjs file\n if (isLocalDirectory(resolvedPath)) {\n const indexBase = resolve(resolvedPath, 'index')\n if (\n cjsExtension.startsWith('.native') &&\n (existsSync(`${indexBase}.ios.js`) ||\n existsSync(`${indexBase}.android.js`))\n ) {\n return\n }\n const indexPath = resolve(resolvedPath, 'index' + jsExtension)\n if (existsSync(indexPath)) {\n // Append '/' if not present\n if (!newModuleSpecifier.endsWith('/')) {\n newModuleSpecifier += '/'\n }\n newModuleSpecifier += 'index' + cjsExtension\n arg.value = newModuleSpecifier\n return\n }\n }\n\n // Check if source file exists (try .js first, then target extension)\n if (\n existsSync(resolvedPath + jsExtension) ||\n existsSync(resolvedPath + cjsExtension)\n ) {\n newModuleSpecifier += cjsExtension\n arg.value = newModuleSpecifier\n return\n }\n }\n }\n }\n }\n },\n },\n } satisfies babel.PluginObj\n}\n\nfunction isLocalDirectory(absolutePath: string): boolean {\n return existsSync(absolutePath) && lstatSync(absolutePath).isDirectory()\n}\n"
10
10
  ]
11
11
  }
@@ -6,6 +6,6 @@
6
6
  ],
7
7
  "version": 3,
8
8
  "sourcesContent": [
9
- "import { existsSync, lstatSync } from 'node:fs'\nimport { dirname, extname, resolve } from 'node:path'\n\nimport type { ConfigAPI, NodePath, PluginObj, PluginPass } from '@babel/core'\nimport * as t from '@babel/types'\nimport type {\n ExportAllDeclaration,\n ExportNamedDeclaration,\n Import,\n ImportDeclaration,\n MemberExpression,\n} from '@babel/types'\n\nexport interface FullySpecifiedOptions {\n ensureFileExists: boolean\n esExtensionDefault: string\n /** List of all extensions which we try to find. */\n tryExtensions: Array<string>\n /** List of extensions that can run in Node.js or in the Browser. */\n esExtensions: Array<string>\n /** Convert process.env.XYZ to import.meta.env.XYZ */\n convertProcessEnvToImportMetaEnv?: boolean\n}\n\nconst DEFAULT_OPTIONS = {\n ensureFileExists: true,\n esExtensionDefault: '.mjs',\n tryExtensions: ['.js'],\n esExtensions: ['.mjs'],\n convertProcessEnvToImportMetaEnv: false,\n} satisfies FullySpecifiedOptions\n\nexport default function FullySpecified(\n api: ConfigAPI,\n rawOptions: Partial<FullySpecifiedOptions> = {}\n): PluginObj {\n api.assertVersion(7)\n\n const options = normalizeOptions(rawOptions)\n\n /** For `import ... from '...'`. */\n const importDeclarationVisitor = (\n path: NodePath<ImportDeclaration>,\n state: PluginPass\n ) => {\n const filePath = state.file.opts.filename\n if (!filePath) return // cannot determine file path therefore cannot proceed\n\n const { node } = path\n if (node.importKind === 'type') return // is a type-only import, skip\n\n const originalModuleSpecifier = node.source.value\n const fullySpecifiedModuleSpecifier = getFullySpecifiedModuleSpecifier(\n originalModuleSpecifier,\n {\n filePath,\n options,\n }\n )\n\n if (fullySpecifiedModuleSpecifier) {\n node.source.value = fullySpecifiedModuleSpecifier\n }\n }\n\n /** For `export ... from '...'`. */\n const exportDeclarationVisitor = (\n path: NodePath<ExportNamedDeclaration> | NodePath<ExportAllDeclaration>,\n state: PluginPass\n ) => {\n const filePath = state.file.opts.filename\n if (!filePath) return // cannot determine file path therefore cannot proceed\n\n const { node } = path\n if (node.exportKind === 'type') return // is a type-only export, skip\n\n const source = node.source\n if (!source) return // is not a re-export, skip\n\n const originalModuleSpecifier = source.value\n const fullySpecifiedModuleSpecifier = getFullySpecifiedModuleSpecifier(\n originalModuleSpecifier,\n {\n filePath,\n options,\n }\n )\n\n if (fullySpecifiedModuleSpecifier) {\n source.value = fullySpecifiedModuleSpecifier\n }\n }\n\n /** For dynamic `import()`s. */\n const importVisitor = (path: NodePath<Import>, state) => {\n const filePath = state.file.opts.filename\n if (!filePath) return // cannot determine file path therefore cannot proceed\n\n const parent = path.parent\n if (parent.type !== 'CallExpression') {\n return // we expect the usage of `import` is a call to it, e.g.: `import('...')`, other usages are not supported\n }\n\n const firstArgOfImportCall = parent.arguments[0]\n if (firstArgOfImportCall.type !== 'StringLiteral') {\n return // we expect the first argument of `import` to be a string, e.g.: `import('./myModule')`, other types are not supported\n }\n\n const originalModuleSpecifier = firstArgOfImportCall.value\n const fullySpecifiedModuleSpecifier = getFullySpecifiedModuleSpecifier(\n originalModuleSpecifier,\n {\n filePath,\n options,\n }\n )\n\n if (fullySpecifiedModuleSpecifier) {\n firstArgOfImportCall.value = fullySpecifiedModuleSpecifier\n }\n }\n\n /** For converting process.env to import.meta.env */\n const memberExpressionVisitor = (path: NodePath<MemberExpression>) => {\n if (!options.convertProcessEnvToImportMetaEnv) return\n\n const { node } = path\n\n // Check if this is process.env.SOMETHING\n if (\n node.object.type === 'MemberExpression' &&\n node.object.object.type === 'Identifier' &&\n node.object.object.name === 'process' &&\n node.object.property.type === 'Identifier' &&\n node.object.property.name === 'env'\n ) {\n // Skip process.env.NODE_ENV - leave it as is\n if (node.property.type === 'Identifier' && node.property.name === 'NODE_ENV') {\n return\n }\n\n // Replace process.env with import.meta.env\n node.object = t.memberExpression(\n t.metaProperty(t.identifier('import'), t.identifier('meta')),\n t.identifier('env')\n )\n }\n }\n\n return {\n name: 'babel-plugin-fully-specified',\n visitor: {\n ImportDeclaration: importDeclarationVisitor,\n ExportNamedDeclaration: exportDeclarationVisitor,\n ExportAllDeclaration: exportDeclarationVisitor,\n Import: importVisitor,\n MemberExpression: memberExpressionVisitor,\n },\n }\n}\n\nfunction normalizeOptions(\n rawOptions: Partial<FullySpecifiedOptions>\n): FullySpecifiedOptions {\n const options = { ...DEFAULT_OPTIONS, ...rawOptions }\n\n if (\n rawOptions.esExtensionDefault &&\n !rawOptions.tryExtensions &&\n rawOptions.esExtensionDefault !== DEFAULT_OPTIONS.esExtensionDefault\n ) {\n options.tryExtensions = [\n rawOptions.esExtensionDefault,\n ...DEFAULT_OPTIONS.tryExtensions.filter(\n (extension) => extension !== rawOptions.esExtensionDefault\n ),\n ]\n }\n\n return options\n}\n\n/**\n * Returns a fully specified [module specifier](https://tc39.es/ecma262/multipage/ecmascript-language-scripts-and-modules.html#prod-ModuleSpecifier) (or `null` if it can't be determined or shouldn't be transformed).\n */\nfunction getFullySpecifiedModuleSpecifier(\n /**\n * The original module specifier in the code.\n *\n * For example, `'./foo'` for `import { foo } from './foo'`.\n */\n originalModuleSpecifier: string,\n {\n filePath,\n options,\n }: {\n /**\n * The absolute file path of the file being transformed.\n *\n * Normally this can be obtained from the 2nd parameter in a visitor function (often named as `state`): `state.file.opts.filename`.\n */\n filePath: string\n /** Options that users pass to babel-plugin-fully-specified. */\n options: FullySpecifiedOptions\n }\n): string | null {\n const fileExt = extname(filePath)\n const fileDir = dirname(filePath)\n\n const isDirectory = isLocalDirectory(resolve(fileDir, originalModuleSpecifier))\n\n const currentModuleExtension = extname(originalModuleSpecifier)\n\n const { tryExtensions, esExtensions, esExtensionDefault, ensureFileExists } = options\n\n const targetModule = evaluateTargetModule({\n moduleSpecifier: originalModuleSpecifier,\n filenameDirectory: fileDir,\n filenameExtension: fileExt,\n currentModuleExtension,\n isDirectory,\n tryExtensions,\n esExtensions,\n esExtensionDefault,\n ensureFileExists,\n })\n\n if (targetModule === false) {\n return null\n }\n\n return targetModule\n}\n\nfunction isLocalDirectory(absoluteDirectory: string) {\n return existsSync(absoluteDirectory) && lstatSync(absoluteDirectory).isDirectory()\n}\n\nfunction evaluateTargetModule({\n moduleSpecifier,\n currentModuleExtension,\n isDirectory,\n filenameDirectory,\n filenameExtension,\n tryExtensions,\n esExtensions,\n esExtensionDefault,\n ensureFileExists,\n}: any): string | false {\n const targetFile = resolve(filenameDirectory, moduleSpecifier)\n\n if (ensureFileExists) {\n for (const extension of tryExtensions) {\n if (existsSync(targetFile + extension)) {\n return moduleSpecifier + esExtensionDefault\n }\n }\n\n if (currentModuleExtension && !esExtensions.includes(currentModuleExtension)) {\n return false\n }\n\n if (isDirectory) {\n const indexModuleSpecifier = `${moduleSpecifier.replace(/\\/$/, '')}/index`\n const indexTargetFile = resolve(filenameDirectory, indexModuleSpecifier)\n\n for (const extension of tryExtensions) {\n if (existsSync(indexTargetFile + extension)) {\n return indexModuleSpecifier + esExtensionDefault\n }\n }\n }\n } else if (esExtensions.includes(filenameExtension)) {\n return moduleSpecifier + esExtensionDefault\n } else {\n return moduleSpecifier + esExtensionDefault\n }\n\n return false\n}\n"
9
+ "import { existsSync, lstatSync } from 'node:fs'\nimport { dirname, extname, resolve } from 'node:path'\n\nimport type { ConfigAPI, NodePath, PluginObj, PluginPass } from '@babel/core'\nimport * as t from '@babel/types'\nimport type {\n ExportAllDeclaration,\n ExportNamedDeclaration,\n Import,\n ImportDeclaration,\n MemberExpression,\n} from '@babel/types'\n\nexport interface FullySpecifiedOptions {\n ensureFileExists: boolean\n esExtensionDefault: string\n /** List of all extensions which we try to find. */\n tryExtensions: Array<string>\n /** List of extensions that can run in Node.js or in the Browser. */\n esExtensions: Array<string>\n /** Convert process.env.XYZ to import.meta.env.XYZ */\n convertProcessEnvToImportMetaEnv?: boolean\n}\n\nconst DEFAULT_OPTIONS = {\n ensureFileExists: true,\n esExtensionDefault: '.mjs',\n tryExtensions: ['.js'],\n esExtensions: ['.mjs'],\n convertProcessEnvToImportMetaEnv: false,\n} satisfies FullySpecifiedOptions\n\nexport default function FullySpecified(\n api: ConfigAPI,\n rawOptions: Partial<FullySpecifiedOptions> = {}\n): PluginObj {\n api.assertVersion(7)\n\n const options = normalizeOptions(rawOptions)\n\n /** For `import ... from '...'`. */\n const importDeclarationVisitor = (\n path: NodePath<ImportDeclaration>,\n state: PluginPass\n ) => {\n const filePath = state.file.opts.filename\n if (!filePath) return // cannot determine file path therefore cannot proceed\n\n const { node } = path\n if (node.importKind === 'type') return // is a type-only import, skip\n\n const originalModuleSpecifier = node.source.value\n const fullySpecifiedModuleSpecifier = getFullySpecifiedModuleSpecifier(\n originalModuleSpecifier,\n {\n filePath,\n options,\n }\n )\n\n if (fullySpecifiedModuleSpecifier) {\n node.source.value = fullySpecifiedModuleSpecifier\n }\n }\n\n /** For `export ... from '...'`. */\n const exportDeclarationVisitor = (\n path: NodePath<ExportNamedDeclaration> | NodePath<ExportAllDeclaration>,\n state: PluginPass\n ) => {\n const filePath = state.file.opts.filename\n if (!filePath) return // cannot determine file path therefore cannot proceed\n\n const { node } = path\n if (node.exportKind === 'type') return // is a type-only export, skip\n\n const source = node.source\n if (!source) return // is not a re-export, skip\n\n const originalModuleSpecifier = source.value\n const fullySpecifiedModuleSpecifier = getFullySpecifiedModuleSpecifier(\n originalModuleSpecifier,\n {\n filePath,\n options,\n }\n )\n\n if (fullySpecifiedModuleSpecifier) {\n source.value = fullySpecifiedModuleSpecifier\n }\n }\n\n /** For dynamic `import()`s. */\n const importVisitor = (path: NodePath<Import>, state) => {\n const filePath = state.file.opts.filename\n if (!filePath) return // cannot determine file path therefore cannot proceed\n\n const parent = path.parent\n if (parent.type !== 'CallExpression') {\n return // we expect the usage of `import` is a call to it, e.g.: `import('...')`, other usages are not supported\n }\n\n const firstArgOfImportCall = parent.arguments[0]\n if (firstArgOfImportCall.type !== 'StringLiteral') {\n return // we expect the first argument of `import` to be a string, e.g.: `import('./myModule')`, other types are not supported\n }\n\n const originalModuleSpecifier = firstArgOfImportCall.value\n const fullySpecifiedModuleSpecifier = getFullySpecifiedModuleSpecifier(\n originalModuleSpecifier,\n {\n filePath,\n options,\n }\n )\n\n if (fullySpecifiedModuleSpecifier) {\n firstArgOfImportCall.value = fullySpecifiedModuleSpecifier\n }\n }\n\n /** For converting process.env to import.meta.env */\n const memberExpressionVisitor = (path: NodePath<MemberExpression>) => {\n if (!options.convertProcessEnvToImportMetaEnv) return\n\n const { node } = path\n\n // Check if this is process.env.SOMETHING\n if (\n node.object.type === 'MemberExpression' &&\n node.object.object.type === 'Identifier' &&\n node.object.object.name === 'process' &&\n node.object.property.type === 'Identifier' &&\n node.object.property.name === 'env'\n ) {\n // Skip process.env.NODE_ENV - leave it as is\n if (node.property.type === 'Identifier' && node.property.name === 'NODE_ENV') {\n return\n }\n\n // Replace process.env with import.meta.env\n node.object = t.memberExpression(\n t.metaProperty(t.identifier('import'), t.identifier('meta')),\n t.identifier('env')\n )\n }\n }\n\n return {\n name: 'babel-plugin-fully-specified',\n visitor: {\n ImportDeclaration: importDeclarationVisitor,\n ExportNamedDeclaration: exportDeclarationVisitor,\n ExportAllDeclaration: exportDeclarationVisitor,\n Import: importVisitor,\n MemberExpression: memberExpressionVisitor,\n },\n }\n}\n\nfunction normalizeOptions(\n rawOptions: Partial<FullySpecifiedOptions>\n): FullySpecifiedOptions {\n const options = { ...DEFAULT_OPTIONS, ...rawOptions }\n\n if (\n rawOptions.esExtensionDefault &&\n !rawOptions.tryExtensions &&\n rawOptions.esExtensionDefault !== DEFAULT_OPTIONS.esExtensionDefault\n ) {\n options.tryExtensions = [\n rawOptions.esExtensionDefault,\n ...DEFAULT_OPTIONS.tryExtensions.filter(\n (extension) => extension !== rawOptions.esExtensionDefault\n ),\n ]\n }\n\n return options\n}\n\n/**\n * Returns a fully specified [module specifier](https://tc39.es/ecma262/multipage/ecmascript-language-scripts-and-modules.html#prod-ModuleSpecifier) (or `null` if it can't be determined or shouldn't be transformed).\n */\nfunction getFullySpecifiedModuleSpecifier(\n /**\n * The original module specifier in the code.\n *\n * For example, `'./foo'` for `import { foo } from './foo'`.\n */\n originalModuleSpecifier: string,\n {\n filePath,\n options,\n }: {\n /**\n * The absolute file path of the file being transformed.\n *\n * Normally this can be obtained from the 2nd parameter in a visitor function (often named as `state`): `state.file.opts.filename`.\n */\n filePath: string\n /** Options that users pass to babel-plugin-fully-specified. */\n options: FullySpecifiedOptions\n }\n): string | null {\n const fileExt = extname(filePath)\n const fileDir = dirname(filePath)\n\n const isDirectory = isLocalDirectory(resolve(fileDir, originalModuleSpecifier))\n\n const currentModuleExtension = extname(originalModuleSpecifier)\n\n const { tryExtensions, esExtensions, esExtensionDefault, ensureFileExists } = options\n\n const targetModule = evaluateTargetModule({\n moduleSpecifier: originalModuleSpecifier,\n filenameDirectory: fileDir,\n filenameExtension: fileExt,\n currentModuleExtension,\n isDirectory,\n tryExtensions,\n esExtensions,\n esExtensionDefault,\n ensureFileExists,\n })\n\n if (targetModule === false) {\n return null\n }\n\n return targetModule\n}\n\nfunction isLocalDirectory(absoluteDirectory: string) {\n return existsSync(absoluteDirectory) && lstatSync(absoluteDirectory).isDirectory()\n}\n\n// native outputs keep platform-split modules extensionless so the react\n// native bundler resolves .ios/.android over .native at bundle time\nfunction isNativeOutput(esExtensionDefault: string) {\n return esExtensionDefault.startsWith('.native')\n}\n\nfunction hasPlatformSibling(absoluteBasePath: string) {\n return (\n existsSync(`${absoluteBasePath}.ios.js`) ||\n existsSync(`${absoluteBasePath}.android.js`)\n )\n}\n\nfunction evaluateTargetModule({\n moduleSpecifier,\n currentModuleExtension,\n isDirectory,\n filenameDirectory,\n filenameExtension,\n tryExtensions,\n esExtensions,\n esExtensionDefault,\n ensureFileExists,\n}: any): string | false {\n const targetFile = resolve(filenameDirectory, moduleSpecifier)\n\n if (ensureFileExists) {\n if (isNativeOutput(esExtensionDefault) && hasPlatformSibling(targetFile)) {\n return false\n }\n\n for (const extension of tryExtensions) {\n if (existsSync(targetFile + extension)) {\n return moduleSpecifier + esExtensionDefault\n }\n }\n\n if (currentModuleExtension && !esExtensions.includes(currentModuleExtension)) {\n return false\n }\n\n if (isDirectory) {\n const indexModuleSpecifier = `${moduleSpecifier.replace(/\\/$/, '')}/index`\n const indexTargetFile = resolve(filenameDirectory, indexModuleSpecifier)\n\n if (isNativeOutput(esExtensionDefault) && hasPlatformSibling(indexTargetFile)) {\n return false\n }\n\n for (const extension of tryExtensions) {\n if (existsSync(indexTargetFile + extension)) {\n return indexModuleSpecifier + esExtensionDefault\n }\n }\n }\n } else if (esExtensions.includes(filenameExtension)) {\n return moduleSpecifier + esExtensionDefault\n } else {\n return moduleSpecifier + esExtensionDefault\n }\n\n return false\n}\n"
10
10
  ]
11
11
  }