| 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> |
|
| 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
|
| 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/
|
| 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
I've opened an issue here: https://github.com/tc39/proposal-regexp-buffer-boundaries/issues/20 I can either re-present |
| 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
|
| 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:
|
| 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
|
| 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 |
| 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/21Updated 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 bindingstwo 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> | |
| 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 |