mirror of
https://github.com/luau-lang/rfcs.git
synced 2025-05-04 10:43:48 +01:00
45 lines
1.6 KiB
Markdown
45 lines
1.6 KiB
Markdown
# Glob import syntax for require-by-string
|
|
|
|
## Motivation
|
|
|
|
- Many patterns utilize current dynamic requires, or load in luau files manually:
|
|
- ECS systems
|
|
- The "service" pattern
|
|
- Module initializers
|
|
- Tests
|
|
- The alternative (writing out manual requires) is quite cumbersome and not feasible to expect developers to do
|
|
- Cross-runtime/platform automated testing is currently impossible
|
|
- Current dynamic requires are not type safe and can have cyclical dependency errors which are not picked up on. This isn't a conceptual limitation, it is totally possible to report.
|
|
- Cross-module compilation may be wanted in the eventual future. But this pattern is common and will not be going away. There should be a way to express "requiring all children of a directory" while still having full cross-module compilation.
|
|
- "Dynamic" requires are unfriendly to tooling & the language. But they're currently _needed_ for ergonomic reasons. We should close the gap, and let static requires (which are friendly to tooling!) be more expressive,
|
|
|
|
## Design
|
|
|
|
- directory/\*\* for descendants
|
|
- directory/\* for children
|
|
- Alphanumeric ordering off file name
|
|
- file1
|
|
- file12
|
|
- file13
|
|
- file2
|
|
- file31
|
|
- file3
|
|
- "File name" does not include extension!
|
|
|
|
```lua
|
|
local children = require("directory/*)") -- array
|
|
local descendants = require("directory/**") -- array
|
|
```
|
|
|
|
## Alternatives
|
|
|
|
- Provide a dictionary where { [name]: return value }?
|
|
- In descendants, this might cause duplicates.
|
|
- Include file extension? Can have duplicates if no file extension.
|
|
|
|
## Drawbacks
|
|
|
|
- Cross-runtime ordering?
|
|
- OS causes implementation concerns?
|
|
- Type concerns?
|
|
- Might promote bad patterns?
|