07:50
<Michael Ficarra>
can I get a chair to propagate the following change to the agenda in TCQ? https://github.com/tc39/agendas/commit/de903ff7e068b5fc69db17c687e1914a8d602a09
08:09
<Olivier Flückiger>
Re. test262 PR. It is very easy to forget, the PR might still change and there might be delays (looking at immutable AB). So I actually prefer to implement features when the tests are landed, treating conditional stage 3 as stage 2.7 effectively.
08:15
<ljharb>
(conditional stage 3 IS 2.7, literally, until the condition is met :-p )
08:16
<Justin Ridgewell>
We can fall back to old TCQ if needed
08:16
<Luca Casonato>
I think TCQ is back up
08:16
<Luca Casonato>
We're trying to RCA it. We've bumped the concurrent request limit, which seems to have fixed it for now.
08:16
<Michael Ficarra>
okay don't all refresh at the same time though lol
08:19
<nicolo-ribaudo>
TCQ seems to be working but I only see 10 active connections?
08:20
<snek>
i think a lot of people didn't reload yet
08:21
<Michael Ficarra>
if test262 maintainers don't have enough time to review all of the test PRs that the committee produces in a timely manner, we should consider having a policy that (at least) champion-written tests that have review from another delegate can be merged after a month or something
08:21
<Mathieu Hofman>
I had added a queue item, now refreshed and it's gone ?
08:21
<nicolo-ribaudo>
TCQ was having problems, add it again
08:21
<Mathieu Hofman>
Do we have a split? There was 35 active connections before I refreshed
08:22
<Michael Ficarra>
we could have lost up to 30 seconds of data in the redeploy
08:22
<Mathieu Hofman>
Someone else had a clarifying question
08:22
<ljharb>
we've talked about that in the past; and the consensus has always been that speed is far less important than correctness
08:24
<Michael Ficarra>
oh, it seems like there actually is a split because the old instance won't shut down until everyone kills their websocket connection 🤔
08:24
<Michael Ficarra>
still working on it
08:24
<Justin Ridgewell>
Do I need to interrupt?
08:24
<ljharb>
so should i reload if i'm on the old one?
08:24
<nicolo-ribaudo>
Maybe put a point of order telling to reload to people on that instance
08:25
<nicolo-ribaudo>
An EOM point of order
08:25
<Michael Ficarra>
a reload may not fix it
08:26
<Aki>
delete localstorage.
08:26
<Aki>
(always)
08:29
<Michael Ficarra>
it seems to be correctly migrating people when they reload
08:29
<Michael Ficarra>
sorry for the inconvenience 🙇‍♂️
08:29
<nicolo-ribaudo>
Where can I send regexp requests for the bot? I'd like it to fix the various intl API names, like "duration format" -> "DurationFormat"
08:30
<Justin Ridgewell>
https://github.com/bakkot/transcribe-to-gdocs/blob/soniox/replacements.js
08:33
<snek>
this is fun https://www.nist.gov/system/files/documents/2023/01/30/appc-23-HB44.pdf
08:34
<snek>

This section lists units of measurement traditionally used in the United States. In keeping with the Metric Conversion Act of
1975 (15 U.S.C. 205a et seq.) as amended by Omnibus Trade and Competitiveness Act of 1988, the ultimate objective is to make
the International System of Units (SI) the primary measurement system used in the United States.

08:40
<Mathieu Hofman>
😅 that's what I get for not reading all the slides to then end. Sorry, my question was actually answered in the presentation
08:52
<Michael Ficarra>
@Clément Pit-Claudel which Unicode property describes that this code point is not recommended for use? https://util.unicode.org/UnicodeJsps/character.jsp?a=%C2%B5
08:52
<ljharb>
to confirm, option-m on a mac is indeed not U+03BC
08:53
<Michael Ficarra>
@Clément Pit-Claudel notably, Deprecated is No
08:58
<nicolo-ribaudo>
Justin Ridgewell The notes report you as telling Shane "Don't object please.". I was distracted from a second so I don't know if you actually said it, can you then double-check?
08:59
<snek>
justin did say that
08:59
<nicolo-ribaudo>
oh ok
09:03
<Clément Pit-Claudel>

https://www.unicode.org/reports/tr25/ page 11

Some Greek letters are encoded elsewhere as technical symbols. These include U+00B5 µ MICRO SIGN, U+2126 Ω OHM SIGN, and several characters among the APL functional symbols in the Miscellaneous Technical block. U+03A9 Ω GREEK LETTER CAPITAL OMEGA is the canonical equivalent of U+2126 Ω and its use is preferred. Micro sign is included in several parts of ISO/IEC 8859, and therefore supported in many legacy environments where U+03BC μ GREEK LETTER SMALL MU is not available. Implementations therefore need to be able to recognize the micro sign, even though U+03BC μ is the preferred character in a Unicode context.

09:04
<Clément Pit-Claudel>

Hmm but as with all things unicode it's not so simple: https://www.unicode.org/versions/Unicode17.0.0/core-spec/chapter-7/

For compatibility purposes, a few Greek letters are separately encoded as symbols in other character blocks. Examples include U+00B5 µ MICRO SIGN in the Latin-1 Supplement character block and U+2126 Ω OHM SIGN in the Letterlike Symbols character block. The ohm sign is canonically equivalent to the capital omega, and normalization would remove any distinction. Its use is therefore discouraged in favor of capital omega. The same equivalence does not exist between micro sign and mu, and use of either character as a micro sign is common.

09:07
<Clément Pit-Claudel>
You are right; "basically deprecated" (what I said) was too strong. I pasted the source above.
09:08
<Michael Ficarra>
Unicode 17 is published much more recently than TR 25, I would go with that
09:09
<Michael Ficarra>
so at the moment, my preference is for µ
09:09
<nicolo-ribaudo>
Can we ask Unicode what we should do here?
09:09
<Michael Ficarra>
@nicolo-ribaudo that'd probably be a good idea
09:09
<nicolo-ribaudo>
I'm sure Eemili has contacts through MessageFormat
09:10
<ljharb>
eg ⌥ m ?
09:11
<Aki>
do we have a formal liaison with unicode?
09:13
<Michael Ficarra>
Mark Davis sometimes joins us for deep Unicode discussions
09:14
<Michael Ficarra>
also Markus Scherer has helped us liaise before
09:16
<Michael Ficarra>
if you want to know more about a codepoint, you can copy it into https://util.unicode.org/UnicodeJsps/character.jsp
09:19
<Aki>
So it's been a couple years since we had a liaison present at a plenary meeting (which of course is not the same thing as 2 years since participation). Is this something we should be aiming for at a future meeting?
09:21
<Andreu Botella>
i was wondering whether Temporal.Duration could be formatted as a sequence unit
09:25
<Clément Pit-Claudel>
Clearly the right format for "5 feet 11" is "One inch short of two yards" /s
09:26
<ljharb>
… isn't that kind of how french numbers work?
09:27
<snek>
"one for six feet" if you say it like dutch time
09:28
<Clément Pit-Claudel>
No no we just could in base twenty between 80 and 100
09:28
<snek>
nobody in the yellow countries knows whether you are saying 29 or 92 because everyone mixes it up in both the native language and english whenever they switch
09:29
<snek>
oh wait this isn't tdz...
09:41
<rbuckton>
Could you not introduce a marker into the format string (i.e., [foot]-and-inch) or a property specifying the unit for scalar whole numbers (i.e., unit: "foot-and-inch", scalarUnit: "foot")?
09:41
<ljharb>
hm, that's interesting
09:41
<ljharb>
a bit awkward but certainly avoids ambiguity
09:43
<rbuckton>
or allow it in the format value: { foot: 6.25, scalar: "foot" }
10:44
<rbuckton>

With the addition of \Z to RegExp buffer boundaries yesterday I realized there is one small design question that still needs to be addressed. I've regularly promoted \Z as matching (?-m:$|\r?\n$), however this isn't consistent with how $ matches LineTerminator in /m ([\n\r\u2028\u2029]), and is specified to allow CRLF. CRLF support is inconsistently supported across other RegEx implementations:

  • Java and .NET match CR, LF, and CRLF
  • Perl, PCRE, and PCRE2 may match CRLF based on the configured newline convention
  • Ruby only supports LF, but relies on line terminator normalization
  • Python only supports LF

I've opened an issue here: https://github.com/tc39/proposal-regexp-buffer-boundaries/issues/20

I can either re-present \Z with modified semantics and ask for consensus or withdraw \Z and advance it separately to give time for discussion.

10:56
<Michael Ficarra>
ugh, it'd probably be best to add an agenda item to split out \Z for now so it doesn't hold back buffer boundaries
10:57
<Richard Gibson>
I'd prefer that as well
11:01
<rbuckton>
https://github.com/tc39/agendas/pull/2109
11:13
<rbuckton>
IMO, to make it more consistent with JS I would probably prefer \Z match LineTerminatorSequence since it preserves the (?-m:(\r?\n)?$) semantics I presented but extends it to match the rest of LineTerminator like (?m:$) does
11:16
<rbuckton>
Actually, what was presented in Stage 1 was exactly that, as it also leveraged https://github.com/tc39/proposal-regexp-r-escape which specified (?:\r\n|[\n\r\u2028\u2029)
11:20
<ljharb>
damnit unicode, have fewer variants
11:22
<ljharb>
on looking tho, there's only one "empty set" character i can find (U+2205). what are the others?
11:22
<Jesse 🇯🇵>
the danish one?
11:23
<ljharb>
oh, ok - not multiple "empty set" chars, but multiple "o with a slash through it" chars
11:23
<Richard Gibson>

https://github.com/tc39/proposal-amount/pull/102#discussion_r3133298432

U+2205 is specifically the code point named "EMPTY SET", and is potentially confusable with U+2300 DIAMETER SIGN ⌀, U+00D8 LATIN CAPITAL LETTER O WITH STROKE Ø, and U+00F8 LATIN SMALL LETTER O WITH STROKE ø

11:25
<Michael Ficarra>
ε?
11:26
<Michael Ficarra>
often used in formal grammars
11:26
<Christian Ulbrich>
Michael Ficarra: That is too small.
11:26
<Michael Ficarra>
@Christian Ulbrich #⏱️💀 Temporal Dead Zone 💀⏱️
11:26
<Jesse 🇯🇵>
we did consider some alternatives, such as "1" (digit one)
11:27
<Michael Ficarra>
I don't understand that one @Jesse 🇯🇵
11:27
<Jesse 🇯🇵>
it's used as "no unit" and it works out in dimensional analysis (things like kg/kg work out to 1 when cancelling common divisors)
11:28
<Jesse 🇯🇵>
the 1 is singled out by the SI standard for notation for dimensionless quantities
11:29
<Michael Ficarra>
okay, it makes sense after being explained
11:29
<Richard Gibson>
the problem there is that "1e6" is in units.xml and therefore must be considered well-formed, so "1" probably only works if an Amount always has a unit (or if the definition of well-formedness is more complex)
11:30
<Richard Gibson>
(not that I'm opposed to an Amount always having a unit)
11:30
<Andreu Botella>
wait, why is 1e6 a unit? does it just represent millions?
11:31
<Richard Gibson>
yeah, and it's deprecated: https://github.com/unicode-org/cldr/blob/main/common/supplemental/units.xml#L633
11:32
<Richard Gibson>
so I guess we actually don't need to support it
11:33
<Richard Gibson>
the current text at https://tc39.es/proposal-amount/ ignores <unitAlias>es
11:34
<Christian Ulbrich>
Brad ist talking but muted
11:59
<Justin Ridgewell>
Filling in the rest of the table
12:04
<ljharb>
justin's right, but they shouldn't be avoiding default :-) tools just don't bother supporting it properly
12:06
<snek>
i'm thinking the "get in queue before writing topic" thing might've been a mistake cuz just seeing "New Topic" and "Reply" for half the items is starting to drive me crazy
12:06
<ljharb>
instead it could show "…" since we're all used to that
12:07
<Andreu Botella>
show keystrokes as they happen
12:07
<Andreu Botella>
/s
12:09
<Justin Ridgewell>
^ You joke, but I'd like that.
12:09
<Michael Ficarra>
the champion saying "we have 40 seconds left" without having to ask the chair is a huge win for new TCQ IMO
12:09
<Justin Ridgewell>
We have a bug about allowing you to continue typing after it moves to your item, but I think people will still be distracted by being asked to speak
12:10
<snek>
"hold on while i finish typing my reply and then i'll reply"
12:11
<Michael Ficarra>
if the queue gets to you before you're finished typing, there's no point in typing anything
12:11
<Michael Ficarra>
just speak
12:11
<Andreu Botella>
what if it was an eom and you were slow to type?
12:12
<Justin Ridgewell>
But then I have to listen to what they're saying instead of forming an opinion from their TLDR
12:12
<Justin Ridgewell>
(And also it makes the Log less pretty, which is the real reason)
12:13
<ljharb>
you can certainly speak right away but you should def finish your topic so that it shows up in the log
12:16
<Christian Ulbrich>
I also find the new topic button with new topic default text distracting.
12:16
<Michael Ficarra>
remember that before yesterday we didn't even have a log!
12:16
<Michael Ficarra>
I appreciate how ambitious everyone is.
12:17
<ljharb>
no michael, we were always at war with eurasia
12:20
<Christian Ulbrich>
Zb Tenerowicz (ZTZ/naugtur): TCQ / and thus GitHub says your name is: "Zbyszek Tenerowicz" but delegates.txt says: "Zbigniew Tenerowicz", which one it is (for the notes)?
12:22
<nicolo-ribaudo>
The rule with him is to never read or pronounce past the first two letters of his name
12:23
<Christian Ulbrich>
That's obvious anyway :)
12:27
<Michael Ficarra>
@Christian Ulbrich The notes should only use official delegate abbreviations anyway.
12:27
<Christian Ulbrich>
Yes, but in each Topic there is Firstname Lastname
12:27
<Andreu Botella>
not at the top of a topic
12:27
<Michael Ficarra>
ah 👍️
12:31
<nicolo-ribaudo>
For test frameworks, more than describe/it it's useful for methods with global state, like setTimeout
12:31
<nicolo-ribaudo>
Where I want to isolate it in a given test
12:31
<Michael Ficarra>
in that case, I would go with what is listed in delegates.txt https://github.com/tc39/notes/blob/c2006112f79aff908b632c05f9a2927fb9f8eec8/delegates.txt#L569
12:32
<nicolo-ribaudo>
But this only solves it if the scope ceiling is transitively propagated to imports (which probably is, for their isolation use case?)
12:32
<Christian Ulbrich>
Michael Ficarra: I would let Zb Tenerowicz (ZTZ/naugtur) decide, what his name really is and have delegates.txt changed, if needed.
12:32
<Christian Ulbrich>
but for the time being, I used delegate.txt as truth.
12:33
<Michael Ficarra>
of course, I just meant until the session is over
12:33
<Christian Ulbrich>
There are more use cases than test runners. vitest for example forces you to import describe etc, but this is not the only use case.
12:36
<Christian Ulbrich>
a very simple use case is, that lodash should not be able to access fetch(), this can be achieved with compartments...
12:37
<keith_miller>
I'm confused, where does this differ from a AST pass that errors when a variable could resolve to the global scope? i.e. doesn't resolve to some let variable? Is this just more convenient than that? I think this is what Justin Ridgewell mentioned but maybe I'm misunderstanding.
12:38
<Justin Ridgewell>
How does scope ceiling solve this? I want use cases for this proposal.
12:39
<Justin Ridgewell>
Especially considering test runner imports test files with access to describe, the test files import source code which does not have access. There's no transitive lockdown of the scope.
12:41
<Christian Ulbrich>
We got time left.
12:41
<Christian Ulbrich>
says TCQ XP
12:42
<ryzokuken>
TCQ XP is too powerful and efficient!
12:42
<ryzokuken>
* why can't i type out xp on element
12:43
<Simon Zünd>
does this mean that modules foo1 and foo2 could import functions from bar but with a different ceiling each?
12:44
<Richard Gibson>
https://github.com/endojs/endo/blob/master/docs/guide.md#compartments
12:44
<Justin Ridgewell>
Compartments is its own proposal
12:44
<Justin Ridgewell>
What motivates this proposal
12:44
<Richard Gibson>
being able to build Compartment on top of it. See also pages 4 and 5 of the slides.
12:45
<nicolo-ribaudo>
For the champions' use cases, would a frozen object work there?
12:47
<nicolo-ribaudo>

I believe the only way this would work is that either:

  • if they both import bar, they actually re-evaluate it and get two separate copies of it (as if there were two separate modules that just happened to have the same contents), each with their own cealing
  • the first importer gives bar the scope celiling and then that's it even if it's imported again
12:47
<Christian Ulbrich>
MAH is on the Q
12:48
<Christian Ulbrich>
at least on my TCQ
12:48
<Michael Ficarra>
we're all on the same TCQ, chill!
12:48
<Christian Ulbrich>
EVEN after a reload.
12:48
<Justin Ridgewell>
We discussed MAH's topic, we didn't advance it though
12:52
<Zb Tenerowicz (ZTZ/naugtur)>
While I never use it casually and I mostly hear it whenever a government official addresses me, "Zbigniew" is the official spelling of my name and for official documents it's the one to use.
12:53
<ljharb>
is szek like, a polish nickname suffix or something? (sorry, i'll take this to TDZ)
12:58
<Zb Tenerowicz (ZTZ/naugtur)>
when ScopeCeiling is introduced by a compartment, importing a module by specifier inside a Compartment creates an instance, so if there were to be different ScopeCeilings, there would be 2 separate module instances. That being said, the recommended use for Compartments is that there would be one bar module in a compartment that it should exist in and it's linked to others.
If we introduced ScopeCeiling without Compartment, it'd necessarily mean a specifier with different ScopeCeiling added creates a separate module instance.
13:01
<Clément Pit-Claudel>
?Might be mildly more readable as (?-m:(?:\r\n|\r|\n|\u2028|\u2029|)$)
13:01
<rbuckton>
either way
13:02
<rbuckton>
Missing a ? there since it's optional
13:02
<Simon Zünd>
Does the language already have a way to get different instances of the same module?
13:02
<Olivier Flückiger>
My main worry with this proposal is that we end up with a kind of "dynamic scoping" situation. And that answer does feed my worry...
13:02
<Olivier Flückiger>
deferred and not-deferred :)
13:02
<ljharb>
all impls i'm aware of allows appending, like, ?2 to the end of the specifier URL to get a different instance
13:02
<Clément Pit-Claudel>
Nope I added | at the end
13:04
<Christian Ulbrich>
ljharb: Don't give away the module cache busting tricks!
13:04
<Zb Tenerowicz (ZTZ/naugtur)>
separate Realms now, separate Compartments in the future (we recently discussed simplifying to have an entity that can be a compartment OR a realm, but that's just a fresh idea from a week ago)
13:05
<Clément Pit-Claudel>
And Aurèle Barrière points out that it should all be wrapped in a lookahead to be actually equivalent, otherwise \Z\n would fail with the substituted equivalent version
13:07
<Clément Pit-Claudel>
So maybe (?=(?:\r\n|\r|\n|\u2028|\u2029|)(?-m:$))
13:25
<Richard Gibson>

Nicolò's first AsyncContext example is probably the best introduction I've ever seen

const myVar = new AsyncContext.Variable();

myVar.run('foo', () => doSomething());
myVar.run('bar', () => doSomethingElse());

async function doSomething() {
  await randomSeconds();
  console.log('In doSomething, myVar =', myVar.get());
}
async function doSomethingElse() {
  await randomSeconds();
  console.log('In doSomethingElse, myVar =', myVar.get());
}
13:32
<bakkot>
we've talked about that in the past; and the consensus has always been that speed is far less important than correctness
True at some margins but not others. The marginal correctness benefits of review from a maintainer specifically vs just a delegate+champion is quite small, and the speed cost is currently measured in months
13:36
<ljharb>
sure. but as both of you have argued multiple times in the past, there's no rush to advance proposals
13:39
<bakkot>
When there's some reason not to, yes
13:41
<bakkot>
I don't think "these tests are written and approved by delegates who have carefully read the proposal, and no one has had further comment in the past months, but the maintainers specifically have not taken action" is a good reason
13:44
<nicolo-ribaudo>
Thanks @softwarechris:matrix.org :) I picked a small time box because usually we didn't get much comments after these presentations, I think we just need a couple more minutes
13:44
<Aki>
SUMMARIES AND CONCLUSIONS EVERYONE
13:46
<rbuckton>
Regarding \Z for RegExp Buffer Boundaries, updates to the proposal spec text and explainer can be found here: https://github.com/tc39/proposal-regexp-buffer-boundaries/pull/21
Updated tests can be found in the existing Test262 PR here: https://github.com/tc39/test262/pull/4975 as of commit b73aa980a4991e89989df0289c9274142745fb66
13:50
<rbuckton>
Not a huge fan of empty disjunctions. They look too much like a typo rather than something intentional.
13:58
<Michael Ficarra>
I like empty disjuncts
14:00
<rbuckton>
I'm not opposed to them, per se, it's just that my first intuition upon seeing them is that it was some sort of mistake.
14:03
<Michael Ficarra>
every RegExp pattern looks like a mistake on first sight
14:03
<nicolo-ribaudo>
So actually it's not the internal slot that makes it a binding, but that's a spec detail
14:03
<nicolo-ribaudo>
We identify bindings as (module, variableName)
14:03
<nicolo-ribaudo>
And for namespaces we have (module, ~namespace~), with that as a special variable name
14:03
<ljharb>
if it's an in-scope identifier, seems like it's a binding as far as JS devs are concerned.
14:03
<ljharb>
if it quacks like a var…
14:04
<nicolo-ribaudo>
But if we had two vars in the two modules, it would throw!
14:04
<nicolo-ribaudo>
This are two aliases to the (./mod.js, ~source~) binding
14:04
<nicolo-ribaudo>
Like for namespace
14:05
<nicolo-ribaudo>
Ok I guess I am creating confusion mixing two concepts of bindings
14:05
<nicolo-ribaudo>
We have bindings that actually define something, and bindings that just are an alias for some other binding (the one intruduced by import declarations)
14:05
<nicolo-ribaudo>
And the question here was "is this just a binding alias to (./mod.js, ~source~), or is it a standalone binding"
14:06
<nicolo-ribaudo>
two vars -> two standalone bindings
two imports of the same thing -> two alias bindings to the same standalone binding
14:14
<nicolo-ribaudo>
Wishing Jordan's was a Topic so I could reply, but - structuredClone(x) becomes equivalent to getting the source of a different module that happens to have the same contents
14:15
<Chris de Almeida>
you can reply with a clarifying question
14:15
<ljharb>
function tostring lets me compare that with functions tho
14:15
<ljharb>
is there a module toString?
14:15
<nicolo-ribaudo>
I hate that, but I'll do it to get it in the notes
14:16
<nicolo-ribaudo>
Ok actually the behavior is clear, I'll wait for my topic
14:17
<Olivier Flückiger>
Reading the github for ESM phase imports it says with the phase object or objects specified here to support the layering of future proposals, including module expressions, module declarations and virtualization through compartments loaders. I guess I don't understand the connection with module expressions (they are just strings) and module declarations (they are just files).
14:18
<nicolo-ribaudo>
If we need to reify module declarations to some first-class JS object, it would be an ESM module source
14:19
<Olivier Flückiger>
so what you are saying is that ESM phase imports need to be exctended to support module declarations?
14:19
<Olivier Flückiger>
the gh claims it's a building block for it
14:20
<nicolo-ribaudo>
No, I mean that import source foo from "./file.js" and module foo {} would both store the same "kind" of object in a foo variable
14:21
<nicolo-ribaudo>
In a world with import source it's not actually needed to have module declarations introduce a local binding (the use case was dynamic import of it to trigger loading of its deps later), since you could do module foo {} and then import source sourceOfFoo from foo;, it's just nice-to-have
14:23
<bakkot>
It's needed for constructing workers wait no I misread ignore me
14:24
<bakkot>
Which is imo the main motivation for the whole thing
14:24
<Olivier Flückiger>
I forgot that a module expression creates a module source that you need to import and not the module itself. Seems a bit confusing.
14:25
<Zb Tenerowicz (ZTZ/naugtur)>
const execute = import is a good mental model ;)
14:25
<Olivier Flückiger>
or put differently we could remove the dependency by having module expression create the module and then have a mechanism to turn it into source module.
14:25
<Olivier Flückiger>
the latter seems like the less common usecase.
14:26
<bakkot>
what does it mean to "create the module"?
14:27
<Olivier Flückiger>
module foo {} could also mean (in current version) let foo = import(module {})
14:27
<sffc>
use Intl.DurationFormat for that; the current proposal does not accept mixed time units in Intl.NF
14:28
<bakkot>
oh, so, create a namespace?
14:28
<bakkot>
I expect the overwhelmingly most common use case for module declarations/expressions will be to get you a thing that you can new Worker(foo)
14:28
<bakkot>
or, at least, this is the main thing that the proposal enables
14:28
<sffc>
If you have evidence of this being useful in software (not just freeform language), please file an issue
14:28
<bakkot>
if it gives you a module namespace, it is not useful for that purpose
14:29
<bakkot>
(it is possible the most common use case will be for bundler output, but bundlers already handle most cases fine without needing declarations)
14:30
<nicolo-ribaudo>
(bundlers are actually the ones asking most vocally for the proposal)
14:31
<Olivier Flückiger>
having a way to create a module as an expression is the language primitve and being able to turn a module into a handle you can pass around is a language primitive.
14:31
<bakkot>
bundlers are the people you talk to who are most vocal about it but among developers the inability to construct workers without a separate source is a much (much) larger painpoint
14:31
<Olivier Flückiger>
i don't see why either of the two needs to depend on the other
14:32
<bakkot>
I don't think we're proposing adding the latter primitive?
14:32
<Olivier Flückiger>
you are not? what is the "source" then?
14:33
<Olivier Flückiger>
literally the one normative PR is making that explicit. it is a way of identifying a module as a first-class identity you can pass around
14:34
<bakkot>
hm. possibly the use of the word "module" is confusing me. there are two reified things under discussion: module namespace objects, and module source objects.
14:34
<guybedford>
module declarations require transfer like sources, so we are working through the same semantics here
14:34
<bakkot>
the proposal is, given a string which names a module, give me a source object; and, given a source object, give me a namespace object
14:34
<bakkot>
right now we have: given a string which names a module, give me a namespace object
14:35
<bakkot>
there is (afaict) no proposal for: given a namespace object, give me a source object
14:36
<rbuckton>
Shared structs ideally need a way to ensure the file and source location within the file are correlated between threads to be certain that the same shared struct declaration loaded in two threads are equivalent. This is necessary to ensure private fields are encapsulated without a 3rd party claiming an identity to expose private state.
14:37
<Justin Ridgewell>
And the first time we're doing in new TCQ!
14:38
<Olivier Flückiger>
that is not quite correct. "string which names a module" is not actually what is going on. because the host needs to unambiguously resolve that to a module source internally. so what you are doing is exposing a way to pass around that resolution result as a first-class value
14:38
<Olivier Flückiger>
and I still maintain that this can be completely orthogonal to module expressions
14:38
<bakkot>
the reason I want module expressions is that I want to be able to do new Worker(module {...}). if module expressions result in a module namespace object, they don't give me that ability
14:39
<guybedford>
rbuckton: as mentioned in the meeting I believe the only way to correctly determine this equality would be via a UUID, and then ensuring that the same initialization source via new Worker(source) was used for all modules.
14:39
<nicolo-ribaudo>
Olivier Flückiger Do you think a module expression should evaluate the module and give you its namespace, or give you another type of handle that is not the source so that you can evaluate that later?
14:39
<keith_miller>
I agree with this assessment at first glance anyway
14:39
<Olivier Flückiger>
I think it should potentially give both options but it does not make sense to me to add this artificial dependency
14:40
<rbuckton>
We'd discussed a UUID or some other correlation token for shared struct identity, but the problem is that it's potentially forgeable and potentially a communications channel.
14:40
<Christian Ulbrich>
There should be an option, that the votes should not be initially visible, because it will create bias.
14:40
<guybedford>
right, it would need to be spec-internal, and not user-exposed for forgeability
14:40
<nicolo-ribaudo>
The module expressions proposal is I believe older than that, and it was creating its own type of module handle that you could then either pass to a worker or evaluate. The reason Guy suggested this dependency is so that we don't have two separate types of handles representing modules
14:40
<snek>
these poll options remind me of the enum in webauthn userVerification: "discouraged" | "preferred" | "required"
14:41
<ljharb>
not just an option; that's just how it should work
14:41
<Olivier Flückiger>
ok, yeah that would be even worse, agreed :)
14:42
<rbuckton>
How would a UUID differ from having a source url?
14:42
<snek>
(the concepts surrounding module expressions date back to es4 i believe)
14:43
<nicolo-ribaudo>

One option that we could have is, if we do only module declarations and not module expressions, say that module declarations to not give you any reified value. It would solve the bundling use case, as they would just use import declarations to import the module declarations.

However, it would then only solve the worker use case when paired with this proposal (without being blocked by it), as you would use import source to get a handle to a module declaration.

14:43
<guybedford>
Note that due to timing, it is possible for workers to import a different source if relying on URLs (if source was modified between main thread and worker load), this was why we chose source text identity as well.
14:43
<rbuckton>
Perhaps we should move this discussion to a thread or to #shared-structs
14:44
<Zb Tenerowicz (ZTZ/naugtur)>
we could make Object.prototype.then exist and be undefined
14:44
<guybedford>
^ sure let's continue there
14:44
<ljharb>
it'd have to be nonwritable/nonconfigurable tho, which is weird
14:44
<bakkot>
lots of things do "then" in foo, so we could not do that. but we could and possibly should make Object.prototype exotically reject properties named "then"
14:45
<Zb Tenerowicz (ZTZ/naugtur)>
yes. that's correct
14:45
<bakkot>
unfortunately many of the reasons to want this involve prototypes other than Object, so this would only be a very partial mitigation
14:45
<snek>
i'm sure nothing bad will happen to optimization pipelines if Object.prototype needs new exotic behavior
14:47
<Mathieu Hofman>
FWIW, I'd be happy to ALSO make Object.prototype exotic, as belt and suspenders
14:47
<Michael Ficarra>
BELT. SUSPENDERS.
14:48
<Michael Ficarra>
here's the proposal from last time, discussed July 2024: https://github.com/tc39/Reflector/issues/535#issue-2392971422
14:48
<bakkot>
I wasn't saying we shouldn't do it!
14:49
<ljharb>
is svelte even used enough to make it web incompatible to break it?
14:49
<bakkot>
... surely that's a shitposting question?
14:49
<bakkot>
(yes, it is very widely used)
14:49
<ljharb>
no it's actually a legit one; it gets a lot of discussion but it has a similar number of downloads as backbone
14:50
<ljharb>
5m/week is very very small
14:50
<Michael Ficarra>
I had no idea what Svelte was and looked it up
14:50
<Michael Ficarra>
used by companies you’ve heard of
14:50
<Michael Ficarra>
that's not the strongest endorsement
14:50
<snek>
we consider web compat risk on a website by website basis and you're saying that 5 /million/ downloads is small?
14:51
<ljharb>
yes. but it is a fair point that it only takes one of those people to use it on a high-traffic website to make it a compat risk
14:51
<nicolo-ribaudo>
I mean it has the logos next to that sentence
14:51
<snek>
is svelte the one that had that little vm that could render wikipedia really fast
14:51
<ljharb>
i guess it's not a useful question anyways, because it's in their compiler
14:52
<Christian Ulbrich>
YES.
14:52
<bakkot>
https://music.apple.com/us/new
14:52
<bakkot>
for example
14:52
<ljharb>
sure, that's an automatic yes then ¯\_(ツ)_/¯
14:52
<Chris de Almeida>
mic was heard fine on the web mtg. problem in room?
14:52
<bakkot>
also https://stackoverflow.com/
14:53
<Michael Ficarra>
possibly
14:53
<Christian Ulbrich>
This is not an automatic YES. Svelte is obviously not an arcane framework, that only gets used in Hogwarts.
14:53
<ljharb>
was a genuine question; it has small ecosystem usage but clearly is outsized-represented by some big websites. fair enough
14:53
<Zb Tenerowicz (ZTZ/naugtur)>
it started breaking up, might not have been obvious remotely
14:54
<Christian Ulbrich>
Not breaking the web is usually not about, not breaking the web I use, but about also the web others are using. FWIW I do not use Svelte.
14:55
<Mathieu Hofman>
I actually like this. A module declaration that only lives in the "specifier space" with no binding available to user code, and requiring import source to reify it.
14:55
<ljharb>
of course. i was only asking if it's used indirectly by a lot of web users. it empirically is, question answered