import Foundation
// WARNING: You included a flag that Swift doesn't support: u
// When this flag is set, it makes the pattern and subject strings to be treated as unicode.
// Swift already treats the pattern and subject strings as unicode by default, so including this flag is redundant.
let pattern = #"(?<=^|[\n;](?:[\t ]*(?:\w+ )?)?)(?:(?:const\s*|let\s*|var\s*)?(?<imports>(?:[$_\p{ID_Start}][$\u200C\u200D\p{ID_Continue}]*)|(?<=const\s*|let\s*|var\s*)(?:[\w\t\n\r "$'*,./:{}-]+?))\s*=\s*)?(?:await\s+)?(?<expression>import\((?<specifier>[\S\t\n\r]+?)(?:,\s*(?<options>\{\s*assert:.+[\w\t\n\r "':]+\}\s*\}))?\))"#
let regex = try! NSRegularExpression(pattern: pattern)
let testString = #"""
await import(foo)
await import('foo')
const foo = await import('bar')
const foo = await import(bar)
const promise = import('./foo');
const { readPackage } = await import('read-pkg')
const {
readPackageUp,
readPackageUpSync
} = await import('read-pkg');
const {
addFive,
addFour,
addThree,
addTwo,
squareFive,
squareFour,
squareThree,
squareTwo
} = await import('./lib')
await import('buzz').then(() => console.log(res)).catch(() => ({}))
var g;const{foo}=await import('bar');const{ foo }=await import('bar')
import('buzz').then(() => console.log(res)).catch(() => ({}))
import('buzz').then(() => console.log(res)).catch(() => ({}))
import('buzz').catch(() => ({}))
const foo = "./utils.mjs"; await import(foo)
const { default: barData } =
await import('./bar.json');
const { default: barData } =
await import('./bar.json', { assert: { type: 'json' } });
(async () => {
if (somethingIsTrue) {
// import module for side effects
await import("/modules/my-module.js");
}
})();
await import('__tests__/report.json', {
assert: { type: 'json' }
})
await import('__tests__/report.json', {
assert: { type: 'json' }
})
(async () => {
if (somethingIsTrue) {
const {
default: myDefault,
foo,
bar,
} = await import("/modules/my-module.js");
}
})();
const main = document.querySelector("main");
for (const link of document.querySelectorAll("nav > a")) {
link.addEventListener("click", (e) => {
e.preventDefault();
import("/modules/my-module.js")
.then((module) => {
module.loadPageInto(main);
})
.then((module) => {
module.loadPageInto(main);
})
.then((module) => {
module.loadPageInto(main);
})
.catch((err) => {
main.textContent = err.message;
});
});
}
let myModule;
if (typeof window === "undefined") {
myModule = await import("module-used-on-server");
} else {
myModule = await import("module-used-in-browser");
}
Promise.all(
Array.from({ length: 10 }).map((_, index) =>
import(`/modules/module-${index}.js`)
)
).then((modules) => modules.forEach((module) => module.load()));
Array.from({ length: 10 }).map((_, index) => {
return import(`/modules/module-${index}.js`)
})
'await import("foo")'
"await import('foo')"
// await import('foo')
/**
* @example
* const { readPackageUp } = await import('read-pkg')
*/
"""#
let stringRange = NSRange(location: 0, length: testString.utf16.count)
let matches = regex.matches(in: testString, range: stringRange)
var result: [[String]] = []
for match in matches {
var groups: [String] = []
for rangeIndex in 1 ..< match.numberOfRanges {
let nsRange = match.range(at: rangeIndex)
guard !NSEqualRanges(nsRange, NSMakeRange(NSNotFound, 0)) else { continue }
let string = (testString as NSString).substring(with: nsRange)
groups.append(string)
}
if !groups.isEmpty {
result.append(groups)
}
}
print(result)
Please keep in mind that these code samples are automatically generated and are not guaranteed to work. If you find any syntax errors, feel free to submit a bug report. For a full regex reference for Swift 5.2, please visit: https://developer.apple.com/documentation/foundation/nsregularexpression