@bongos/core 1.20.74 → 1.20.76
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/.bongos-core.json +68 -48
- package/clients/bongos-client/README.md +1 -1
- package/clients/bongos-client/bongos-client.global.js +2 -0
- package/clients/bongos-client/index.cjs +2 -0
- package/clients/bongos-client/index.d.ts +4 -0
- package/clients/bongos-client/index.mjs +2 -0
- package/docs/api/openapi.json +79 -3
- package/docs/api-reference.md +3 -2
- package/docs/copy-inventory.md +482 -409
- package/docs/copy-registry.json +1230 -560
- package/docs/module-api-changelog.md +4 -0
- package/docs/page-inventory.json +9 -1
- package/docs/page-readings.json +1189 -765
- package/modules/hall-ui/public/profile-roles.js +170 -0
- package/modules/hall-ui/public/profile.css +42 -5
- package/modules/hall-ui/public/profile.html +12 -5
- package/modules/hall-ui/public/profile.js +66 -27
- package/modules/hall-ui/public/profile.states.json +39 -1
- package/modules/hall-ui/records/profile-roles.md +32 -0
- package/modules/provisioning/routes/provisioning.js +35 -0
- package/modules/public-landing/public/assets/cosmos.css +1 -1
- package/modules/public-landing/public/projects.html +589 -63
- package/modules/public-landing/public/projects.probes.json +8 -5
- package/modules/public-landing/public/projects.states.json +19 -14
- package/modules/ui-design/kit/lib.js +4 -2
- package/modules/ui-design/kit/serve.js +5 -0
- package/package-lock.json +2 -2
- package/package.json +1 -1
- package/release-notes.json +12 -0
- package/src/module-api.js +1 -1
- package/tests/founding_builders.mjs +2 -1
- package/tests/helpers.mjs +4 -0
- package/tests/profile_role_headline.mjs +201 -0
- package/tests/profile_ui_cross_project.mjs +3 -0
- package/tests/projects_hub.mjs +9 -5
- package/tests/projects_hub_app_status.mjs +1 -1
- package/tests/projects_hub_app_step.mjs +10 -10
- package/tests/projects_hub_look.mjs +7 -7
- package/tests/projects_hub_module_picker.mjs +9 -9
- package/tests/projects_hub_pre_uat.mjs +2 -1
- package/tests/wizard_demo.mjs +1 -1
- package/tests/wizard_draft_resume.mjs +1 -1
- package/tests/wizard_front_door.mjs +11 -7
- package/tests/wizard_intent_resume.mjs +9 -9
- package/tests/wizard_physics.mjs +264 -0
|
@@ -159,16 +159,19 @@
|
|
|
159
159
|
"steps": [["wait",900],["click","[data-disc-ask]"],["wait",200],["fill","#mDiscName","old-lantern"],["wait",100],["click","[data-disc-yes]"],["wait",900]],
|
|
160
160
|
"expect": {"text":[["#mDisc .addr","This project is being disconnected."],["#mName","old-lantern"]],"hidden":["#mDiscName","[data-disc-ask]"]} },
|
|
161
161
|
{ "name": "the wizard driver (task 1003346): name, type, about, home (fresh; the stub grants repo access, so the new repository is named from the project), address (the handle's verdict), the review as a ledger, then the filing — the done panel with the standup rail and the human steps", "auth": true, "width": 1440, "url": "/projects?view=new",
|
|
162
|
-
"steps": [["wait",600],["click","#termsAck"],["click","#panel-terms button[type=submit]"],["wait",400],["click","#panel-fork button[type=submit]"],["wait",400],["fill","#newName","Mercury"],["click","#panel-name button[type=submit]"],["wait",400],["click","#typeCards .tpill[data-type=\"game\"]"],["click","#panel-type button[type=submit]"],["wait",400],["fill","#f-desc","A co-op farming game where the seasons never repeat."],["click","#teamCards .tpill[data-team=\"small-team\"]"],["click","#panel-detail button[type=submit]"],["wait",900],["click","#panel-modules button[type=submit]"],["wait",400],["click","#panel-home button[type=submit]"],["wait",400],["fill","#f-slug","mercury"],["wait",900],["fill","#f-domain","mercury.example.com"],["wait",200],["click","#panel-address button[type=submit]"],["wait",400],["click","#panel-app button[type=submit]"],["wait",400],["click","#panel-look button[type=submit]"],["wait",400],["click","#doCreate"],["wait",1500]],
|
|
162
|
+
"steps": [["wait",600],["click","#termsAck"],["click","#panel-terms button[type=submit]"],["wait",400],["click","#panel-fork button[type=submit]"],["wait",400],["click","#physNext"],["wait",200],["click","[data-phys=\"project_state\"][data-val=\"new\"]"],["click","#physNext"],["wait",500],["select","#physCountry","US"],["click","[data-phys=\"builder_geography\"][data-val=\"global\"]"],["click","#physNext"],["wait",200],["click","[data-phys=\"minors_on_board\"][data-val=\"false\"]"],["click","#physNext"],["wait",200],["click","[data-phys=\"entity\"][data-val=\"intent-solo\"]"],["click","#physNext"],["wait",400],["fill","#newName","Mercury"],["click","#panel-name button[type=submit]"],["wait",400],["click","#typeCards .tpill[data-type=\"game\"]"],["click","#panel-type button[type=submit]"],["wait",400],["fill","#f-desc","A co-op farming game where the seasons never repeat."],["click","#teamCards .tpill[data-team=\"small-team\"]"],["click","#panel-detail button[type=submit]"],["wait",900],["click","#panel-modules button[type=submit]"],["wait",400],["click","#panel-home button[type=submit]"],["wait",400],["fill","#f-slug","mercury"],["wait",900],["fill","#f-domain","mercury.example.com"],["wait",200],["click","#panel-address button[type=submit]"],["wait",400],["click","#panel-app button[type=submit]"],["wait",400],["click","#panel-look button[type=submit]"],["wait",400],["click","#doCreate"],["wait",1500]],
|
|
163
163
|
"expect": {"visible":["#panel-done","#liveProgress .prog","#liveProgress .prog .stages li.now","#humanSteps li"],"hidden":["#panel-review","#panel-name"],"text":[["#done-h","The drums are rolling"]],"attr":[["#panel-done","class","panel on"]]} },
|
|
164
|
-
{ "name": "the front door (task 1004417): Proceed is refused until the terms are ticked, the fork's demo door opens the demo's setup and Back returns to the doors, and Begin planet creation goes on to the name step with the rail back", "auth": true, "width": 1440, "url": "/projects?view=new",
|
|
165
|
-
"steps": [["wait",600],["click","#panel-terms button[type=submit]"],["wait",300],["click","#termsAck"],["click","#panel-terms button[type=submit]"],["wait",400],["click","#wizDemo"],["wait",200],["click","#demoBack1"],["wait",200],["click","#panel-fork button[type=submit]"],["wait",400]],
|
|
166
|
-
"expect": {"visible":["#panel-name","#view-new .steps","#view-new .steps li.now"],"hidden":["#panel-fork","#panel-terms"],"attr":[["#wizDemo","aria-expanded","false"],["#view-new .steps li.now","data-step","
|
|
164
|
+
{ "name": "the front door (task 1004417): Proceed is refused until the terms are ticked, the fork's demo door opens the demo's setup and Back returns to the doors, and Begin planet creation goes on, through the four planet-physics questions, to the name step with the rail back", "auth": true, "width": 1440, "url": "/projects?view=new",
|
|
165
|
+
"steps": [["wait",600],["click","#panel-terms button[type=submit]"],["wait",300],["click","#termsAck"],["click","#panel-terms button[type=submit]"],["wait",400],["click","#wizDemo"],["wait",200],["click","#demoBack1"],["wait",200],["click","#panel-fork button[type=submit]"],["wait",400],["click","#physNext"],["wait",200],["click","[data-phys=\"project_state\"][data-val=\"new\"]"],["click","#physNext"],["wait",500],["select","#physCountry","US"],["click","[data-phys=\"builder_geography\"][data-val=\"global\"]"],["click","#physNext"],["wait",200],["click","[data-phys=\"minors_on_board\"][data-val=\"false\"]"],["click","#physNext"],["wait",200],["click","[data-phys=\"entity\"][data-val=\"intent-solo\"]"],["click","#physNext"],["wait",400]],
|
|
166
|
+
"expect": {"visible":["#panel-name","#view-new .steps","#view-new .steps li.now"],"hidden":["#panel-fork","#panel-terms"],"attr":[["#wizDemo","aria-expanded","false"],["#view-new .steps li.now","data-step","4"]]} },
|
|
167
|
+
{ "name": "planet physics (task 1004418): an existing planet asks what exists and which is main, a country with states asks for one, young builders put the protective ring on the planet and show the age tiers, and an entity gives the planet its core", "auth": true, "width": 1440, "url": "/projects?view=new",
|
|
168
|
+
"steps": [["wait",600],["click","#termsAck"],["click","#panel-terms button[type=submit]"],["wait",400],["click","#panel-fork button[type=submit]"],["wait",400],["click","#physNext"],["wait",200],["click","#physNext"],["wait",200],["click","[data-phys=\"project_state\"][data-val=\"existing\"]"],["click","#physExisting [data-work=\"code\"]"],["click","#physNext"],["wait",500],["select","#physCountry","US"],["wait",100],["select","#physRegion","US-CA"],["click","[data-phys=\"builder_geography\"][data-val=\"us-eu\"]"],["click","#physNext"],["wait",200],["click","[data-phys=\"minors_on_board\"][data-val=\"true\"]"],["wait",100],["click","#physNext"],["wait",200],["click","[data-phys=\"entity\"][data-val=\"for-profit\"]"],["wait",200]],
|
|
169
|
+
"expect": {"visible":["#panel-physics .physQ[data-q=\"4\"]","#physForms","#physGuard","#physPlanet"],"hidden":["#physIntent","#panel-name"],"attr":[["#physPlanet","src","/assets/world/r3-gold-blob-cut.webp"],["[data-phys=\"entity\"][data-val=\"for-profit\"]","aria-pressed","true"]],"text":[["#physCoords","state existing · home us-ca · builders us + eu · ages 13+ · core organization"]]} },
|
|
167
170
|
{ "name": "the front door at 390: the fork's two doors stack inside one pill and the walk still reaches the name step", "auth": true, "width": 390, "url": "/projects?view=new",
|
|
168
171
|
"steps": [["wait",600],["click","#termsAck"],["click","#panel-terms button[type=submit]"],["wait",400]],
|
|
169
172
|
"expect": {"visible":["#panel-fork",".doorPill","#wizDemo","#panel-fork button[type=submit]"],"hidden":["#view-new .steps"]} },
|
|
170
173
|
{ "name": "the wizard driver at 390: the rail folds to two rows of three and the walk still reaches the review", "auth": true, "width": 390, "url": "/projects?view=new",
|
|
171
|
-
"steps": [["wait",600],["click","#termsAck"],["click","#panel-terms button[type=submit]"],["wait",400],["click","#panel-fork button[type=submit]"],["wait",400],["fill","#newName","Mercury"],["click","#panel-name button[type=submit]"],["wait",400],["click","#typeCards .tpill[data-type=\"game\"]"],["click","#panel-type button[type=submit]"],["wait",400],["fill","#f-desc","A co-op farming game where the seasons never repeat."],["click","#teamCards .tpill[data-team=\"small-team\"]"],["click","#panel-detail button[type=submit]"],["wait",900],["click","#panel-modules button[type=submit]"],["wait",400],["click","#panel-home button[type=submit]"],["wait",400],["fill","#f-slug","mercury"],["wait",900],["fill","#f-domain","mercury.example.com"],["wait",200],["click","#panel-address button[type=submit]"],["wait",400],["click","#panel-app button[type=submit]"],["wait",400],["click","#panel-look button[type=submit]"],["wait",400]],
|
|
174
|
+
"steps": [["wait",600],["click","#termsAck"],["click","#panel-terms button[type=submit]"],["wait",400],["click","#panel-fork button[type=submit]"],["wait",400],["click","#physNext"],["wait",200],["click","[data-phys=\"project_state\"][data-val=\"new\"]"],["click","#physNext"],["wait",500],["select","#physCountry","US"],["click","[data-phys=\"builder_geography\"][data-val=\"global\"]"],["click","#physNext"],["wait",200],["click","[data-phys=\"minors_on_board\"][data-val=\"false\"]"],["click","#physNext"],["wait",200],["click","[data-phys=\"entity\"][data-val=\"intent-solo\"]"],["click","#physNext"],["wait",400],["fill","#newName","Mercury"],["click","#panel-name button[type=submit]"],["wait",400],["click","#typeCards .tpill[data-type=\"game\"]"],["click","#panel-type button[type=submit]"],["wait",400],["fill","#f-desc","A co-op farming game where the seasons never repeat."],["click","#teamCards .tpill[data-team=\"small-team\"]"],["click","#panel-detail button[type=submit]"],["wait",900],["click","#panel-modules button[type=submit]"],["wait",400],["click","#panel-home button[type=submit]"],["wait",400],["fill","#f-slug","mercury"],["wait",900],["fill","#f-domain","mercury.example.com"],["wait",200],["click","#panel-address button[type=submit]"],["wait",400],["click","#panel-app button[type=submit]"],["wait",400],["click","#panel-look button[type=submit]"],["wait",400]],
|
|
172
175
|
"expect": {"visible":["#panel-review","#reviewList li","#doCreate"],"hidden":["#panel-address"],"text":[["#rev-h","Ready to roll"]]} }
|
|
173
176
|
]
|
|
174
177
|
}
|
|
@@ -41,21 +41,26 @@
|
|
|
41
41
|
"in-new-fork": { "auth": true, "url": "/projects?view=new", "actions": [["wait",600],["click","#termsAck"],["click","#panel-terms button[type=submit]"],["wait",400]], "expect": {"visible":["#panel-fork",".doorPill","#wizDemo",".forkStage",".forkRoutes"],"hidden":["#panel-terms","#view-new .steps","#demoSoon",".bongoCell"]} },
|
|
42
42
|
"in-new-fork-demo": { "auth": true, "url": "/projects?view=new", "actions": [["wait",600],["click","#termsAck"],["click","#panel-terms button[type=submit]"],["wait",400],["click","#wizDemo"],["wait",300]], "expect": {"visible":["#panel-fork","#demoSetup","#demoFitVerdict","#demoRing"],"hidden":["#forkIntro","#demoReady"],"attr":[["#wizDemo","aria-expanded","true"]]} },
|
|
43
43
|
"in-new-demo-ready": { "auth": true, "url": "/projects?view=new", "actions": [["wait",600],["click","#termsAck"],["click","#panel-terms button[type=submit]"],["wait",400],["click","#wizDemo"],["wait",300],["click","[data-demo-step=\"hours\"][data-by=\"1\"]"],["click","#demoNext1"],["wait",300]], "expect": {"visible":["#demoReady",".demoLedger","#demoInvite1","#demoInvite2"],"hidden":["#demoSetup","#forkIntro"],"text":[["#demoLHours","5 hours each"]]} },
|
|
44
|
-
"in-new-
|
|
44
|
+
"in-new-physics": { "auth": true, "url": "/projects?view=new", "actions": [["wait",600],["click","#termsAck"],["click","#panel-terms button[type=submit]"],["wait",400],["click","#panel-fork button[type=submit]"],["wait",400]], "expect": {"visible":["#panel-physics","#physStage","[data-phys-start]"],"hidden":["#panel-fork","#physRail"]} },
|
|
45
|
+
"in-new-physics-state": { "auth": true, "url": "/projects?view=new", "actions": [["wait",600],["click","#termsAck"],["click","#panel-terms button[type=submit]"],["wait",400],["click","#panel-fork button[type=submit]"],["wait",400],["click","#physNext"],["wait",200],["click","[data-phys=\"project_state\"][data-val=\"existing\"]"],["click","#physExisting [data-work=\"code\"]"],["click","#physExisting [data-work=\"digital-files\"]"],["wait",200]], "expect": {"visible":["#physExisting","#physDesc","#physRail"],"hidden":["#physStage .physGuard"]} },
|
|
46
|
+
"in-new-physics-geo": { "auth": true, "url": "/projects?view=new", "actions": [["wait",600],["click","#termsAck"],["click","#panel-terms button[type=submit]"],["wait",400],["click","#panel-fork button[type=submit]"],["wait",400],["click","#physNext"],["wait",200],["click","[data-phys=\"project_state\"][data-val=\"new\"]"],["click","#physNext"],["wait",500],["select","#physCountry","US"],["wait",100],["select","#physRegion","US-CA"],["click","[data-phys=\"builder_geography\"][data-val=\"us-eu\"]"],["wait",200]], "expect": {"visible":["#physCountry","#physRegionField"]} },
|
|
47
|
+
"in-new-physics-ages": { "auth": true, "url": "/projects?view=new", "actions": [["wait",600],["click","#termsAck"],["click","#panel-terms button[type=submit]"],["wait",400],["click","#panel-fork button[type=submit]"],["wait",400],["click","#physNext"],["wait",200],["click","[data-phys=\"project_state\"][data-val=\"new\"]"],["click","#physNext"],["wait",500],["select","#physCountry","US"],["wait",100],["select","#physRegion","US-CA"],["click","[data-phys=\"builder_geography\"][data-val=\"us-eu\"]"],["wait",200],["click","#physNext"],["wait",200],["click","[data-phys=\"minors_on_board\"][data-val=\"true\"]"],["wait",200]], "expect": {"visible":["#physAges","#physGuard"]} },
|
|
48
|
+
"in-new-physics-entity": { "auth": true, "url": "/projects?view=new", "actions": [["wait",600],["click","#termsAck"],["click","#panel-terms button[type=submit]"],["wait",400],["click","#panel-fork button[type=submit]"],["wait",400],["click","#physNext"],["wait",200],["click","[data-phys=\"project_state\"][data-val=\"new\"]"],["click","#physNext"],["wait",500],["select","#physCountry","US"],["wait",100],["select","#physRegion","US-CA"],["click","[data-phys=\"builder_geography\"][data-val=\"us-eu\"]"],["wait",200],["click","#physNext"],["wait",200],["click","[data-phys=\"minors_on_board\"][data-val=\"true\"]"],["wait",200],["click","#physNext"],["wait",200],["click","[data-phys=\"entity\"][data-val=\"intent-solo\"]"],["wait",200]], "expect": {"visible":["#physIntent","#physHaveEntity"],"hidden":["#physForms"]} },
|
|
49
|
+
"in-new-name": { "auth": true, "url": "/projects?view=new", "actions": [["wait",600],["click","#termsAck"],["click","#panel-terms button[type=submit]"],["wait",400],["click","#panel-fork button[type=submit]"],["wait",400],["click","#physNext"],["wait",200],["click","[data-phys=\"project_state\"][data-val=\"new\"]"],["click","#physNext"],["wait",500],["select","#physCountry","US"],["click","[data-phys=\"builder_geography\"][data-val=\"global\"]"],["click","#physNext"],["wait",200],["click","[data-phys=\"minors_on_board\"][data-val=\"false\"]"],["click","#physNext"],["wait",200],["click","[data-phys=\"entity\"][data-val=\"intent-solo\"]"],["click","#physNext"],["wait",400]], "expect": {"visible":["#panel-name","#newName","#view-new .steps"],"hidden":["#panel-fork","#panel-terms"]} },
|
|
45
50
|
"out-new": { "auth": false, "url": "/projects?view=new", "expect": { "hidden": ["#qWrap"] } },
|
|
46
|
-
"in-new-type": { "auth": true, "url": "/projects?view=new", "actions": [["wait",600],["click","#termsAck"],["click","#panel-terms button[type=submit]"],["wait",400],["click","#panel-fork button[type=submit]"],["wait",400],["fill","#newName","Mercury"],["click","#panel-name button[type=submit]"],["wait",400]], "expect": {"visible":["#panel-type"],"hidden":["#panel-name","#qWrap"]} },
|
|
47
|
-
"in-new-about": { "auth": true, "url": "/projects?view=new", "actions": [["wait",600],["click","#termsAck"],["click","#panel-terms button[type=submit]"],["wait",400],["click","#panel-fork button[type=submit]"],["wait",400],["fill","#newName","Mercury"],["click","#panel-name button[type=submit]"],["wait",400],["click","#typeCards .tpill[data-type=\"game\"]"],["click","#panel-type button[type=submit]"],["wait",400]], "expect": {"visible":["#panel-detail"],"hidden":["#panel-type","#qWrap"]} },
|
|
48
|
-
"in-new-modules": { "auth": true, "url": "/projects?view=new", "actions": [["wait",600],["click","#termsAck"],["click","#panel-terms button[type=submit]"],["wait",400],["click","#panel-fork button[type=submit]"],["wait",400],["fill","#newName","Mercury"],["click","#panel-name button[type=submit]"],["wait",400],["click","#typeCards .tpill[data-type=\"game\"]"],["click","#panel-type button[type=submit]"],["wait",400],["fill","#f-desc","A co-op farming game where the seasons never repeat."],["click","#teamCards .tpill[data-team=\"small-team\"]"],["click","#panel-detail button[type=submit]"],["wait",900]], "expect": {"visible":["#panel-modules","#modQ","#modCards .tpill[aria-pressed=\"true\"]","#modCoreNote"],"hidden":["#panel-detail","#qWrap"]} },
|
|
49
|
-
"in-new-modules-search": { "auth": true, "url": "/projects?view=new", "actions": [["wait",600],["click","#termsAck"],["click","#panel-terms button[type=submit]"],["wait",400],["click","#panel-fork button[type=submit]"],["wait",400],["fill","#newName","Mercury"],["click","#panel-name button[type=submit]"],["wait",400],["click","#typeCards .tpill[data-type=\"game\"]"],["click","#panel-type button[type=submit]"],["wait",400],["fill","#f-desc","A co-op farming game where the seasons never repeat."],["click","#teamCards .tpill[data-team=\"small-team\"]"],["click","#panel-detail button[type=submit]"],["wait",900],["fill","#modQ","discord"],["wait",200]], "expect": {"visible":["#panel-modules","#modQ"],"value":[["#modQ","discord"]],"count":[["#modCards .tpill",1],["#modCards .tpill[data-mod=\"discord\"]",1]],"text":[["#modFilterNote","Showing 1 of 3. 2 extras are switched on, including any this search is hiding."]]} },
|
|
50
|
-
"in-new-home": { "auth": true, "url": "/projects?view=new", "actions": [["wait",600],["click","#termsAck"],["click","#panel-terms button[type=submit]"],["wait",400],["click","#panel-fork button[type=submit]"],["wait",400],["fill","#newName","Mercury"],["click","#panel-name button[type=submit]"],["wait",400],["click","#typeCards .tpill[data-type=\"game\"]"],["click","#panel-type button[type=submit]"],["wait",400],["fill","#f-desc","A co-op farming game where the seasons never repeat."],["click","#teamCards .tpill[data-team=\"small-team\"]"],["click","#panel-detail button[type=submit]"],["wait",900],["click","#panel-modules button[type=submit]"],["wait",400]], "expect": {"visible":["#panel-home"],"hidden":["#panel-detail","#qWrap"]} },
|
|
51
|
-
"in-new-address": { "auth": true, "url": "/projects?view=new", "actions": [["wait",600],["click","#termsAck"],["click","#panel-terms button[type=submit]"],["wait",400],["click","#panel-fork button[type=submit]"],["wait",400],["fill","#newName","Mercury"],["click","#panel-name button[type=submit]"],["wait",400],["click","#typeCards .tpill[data-type=\"game\"]"],["click","#panel-type button[type=submit]"],["wait",400],["fill","#f-desc","A co-op farming game where the seasons never repeat."],["click","#teamCards .tpill[data-team=\"small-team\"]"],["click","#panel-detail button[type=submit]"],["wait",900],["click","#panel-modules button[type=submit]"],["wait",400],["click","#panel-home button[type=submit]"],["wait",400]], "expect": {"visible":["#panel-address"],"hidden":["#panel-home","#qWrap"]} },
|
|
52
|
-
"in-new-app": { "auth": true, "url": "/projects?view=new", "actions": [["wait",600],["click","#termsAck"],["click","#panel-terms button[type=submit]"],["wait",400],["click","#panel-fork button[type=submit]"],["wait",400],["fill","#newName","Mercury"],["click","#panel-name button[type=submit]"],["wait",400],["click","#typeCards .tpill[data-type=\"game\"]"],["click","#panel-type button[type=submit]"],["wait",400],["fill","#f-desc","A co-op farming game where the seasons never repeat."],["click","#teamCards .tpill[data-team=\"small-team\"]"],["click","#panel-detail button[type=submit]"],["wait",900],["click","#panel-modules button[type=submit]"],["wait",400],["click","#panel-home button[type=submit]"],["wait",400],["fill","#f-slug","mercury"],["wait",900],["fill","#f-domain","mercury.example.com"],["wait",200],["click","#panel-address button[type=submit]"],["wait",400]], "expect": {"visible":["#panel-app","#appOpts","#appOptRender"],"hidden":["#panel-address","#panel-review","#qWrap"]} },
|
|
53
|
-
"in-new-app-render": { "auth": true, "url": "/projects?view=new", "actions": [["wait",600],["click","#termsAck"],["click","#panel-terms button[type=submit]"],["wait",400],["click","#panel-fork button[type=submit]"],["wait",400],["fill","#newName","Mercury"],["click","#panel-name button[type=submit]"],["wait",400],["click","#typeCards .tpill[data-type=\"game\"]"],["click","#panel-type button[type=submit]"],["wait",400],["fill","#f-desc","A co-op farming game where the seasons never repeat."],["click","#teamCards .tpill[data-team=\"small-team\"]"],["click","#panel-detail button[type=submit]"],["wait",900],["click","#panel-modules button[type=submit]"],["wait",400],["click","#panel-home button[type=submit]"],["wait",400],["fill","#f-slug","mercury"],["wait",900],["fill","#f-domain","mercury.example.com"],["wait",200],["click","#panel-address button[type=submit]"],["wait",400],["click","#appOptRender input"],["wait",300]], "expect": {"visible":["#panel-app","#renderSetup","#f-renderKey","#renderCheck"],"hidden":["#renderWs","#renderSvc","#renderNew"]} },
|
|
54
|
-
"in-new-look": {"auth":true,"url":"/projects?view=new","actions":[["wait",600],["click","#termsAck"],["click","#panel-terms button[type=submit]"],["wait",400],["click","#panel-fork button[type=submit]"],["wait",400],["fill","#newName","Mercury"],["click","#panel-name button[type=submit]"],["wait",400],["click","#typeCards .tpill[data-type=\"game\"]"],["click","#panel-type button[type=submit]"],["wait",400],["fill","#f-desc","A co-op farming game where the seasons never repeat."],["click","#teamCards .tpill[data-team=\"small-team\"]"],["click","#panel-detail button[type=submit]"],["wait",900],["click","#panel-modules button[type=submit]"],["wait",400],["click","#panel-home button[type=submit]"],["wait",400],["fill","#f-slug","mercury"],["wait",900],["fill","#f-domain","mercury.example.com"],["wait",200],["click","#panel-address button[type=submit]"],["wait",400],["click","#panel-app button[type=submit]"],["wait",400]],"expect":{"visible":["#panel-look","#wizLook","#wizLook-chrome-world","#wizTint","#wizLogo",".lookPrev .mh.light",".lookPrev .mh.dark"],"hidden":["#panel-app","#panel-review"]}},
|
|
55
|
-
"in-new-look-custom": {"auth":true,"url":"/projects?view=new","actions":[["wait",600],["click","#termsAck"],["click","#panel-terms button[type=submit]"],["wait",400],["click","#panel-fork button[type=submit]"],["wait",400],["fill","#newName","Mercury"],["click","#panel-name button[type=submit]"],["wait",400],["click","#typeCards .tpill[data-type=\"game\"]"],["click","#panel-type button[type=submit]"],["wait",400],["fill","#f-desc","A co-op farming game where the seasons never repeat."],["click","#teamCards .tpill[data-team=\"small-team\"]"],["click","#panel-detail button[type=submit]"],["wait",900],["click","#panel-modules button[type=submit]"],["wait",400],["click","#panel-home button[type=submit]"],["wait",400],["fill","#f-slug","mercury"],["wait",900],["fill","#f-domain","mercury.example.com"],["wait",200],["click","#panel-address button[type=submit]"],["wait",400],["click","#panel-app button[type=submit]"],["wait",400],["click","#wizLook-custom"],["wait",200]],"expect":{"visible":["#panel-look","#wizAccent","#wizAccentNote"],"hidden":["#panel-review"]}},
|
|
56
|
-
"in-new-review": { "auth": true, "url": "/projects?view=new", "actions": [["wait",600],["click","#termsAck"],["click","#panel-terms button[type=submit]"],["wait",400],["click","#panel-fork button[type=submit]"],["wait",400],["fill","#newName","Mercury"],["click","#panel-name button[type=submit]"],["wait",400],["click","#typeCards .tpill[data-type=\"game\"]"],["click","#panel-type button[type=submit]"],["wait",400],["fill","#f-desc","A co-op farming game where the seasons never repeat."],["click","#teamCards .tpill[data-team=\"small-team\"]"],["click","#panel-detail button[type=submit]"],["wait",900],["click","#panel-modules button[type=submit]"],["wait",400],["click","#panel-home button[type=submit]"],["wait",400],["fill","#f-slug","mercury"],["wait",900],["fill","#f-domain","mercury.example.com"],["wait",200],["click","#panel-address button[type=submit]"],["wait",400],["click","#panel-app button[type=submit]"],["wait",400],["click","#panel-look button[type=submit]"],["wait",400]], "expect": {"visible":["#panel-review","#reviewList li"],"hidden":["#panel-address","#qWrap"]} },
|
|
57
|
-
"in-new-done": { "auth": true, "url": "/projects?view=new", "actions": [["wait",600],["click","#termsAck"],["click","#panel-terms button[type=submit]"],["wait",400],["click","#panel-fork button[type=submit]"],["wait",400],["fill","#newName","Mercury"],["click","#panel-name button[type=submit]"],["wait",400],["click","#typeCards .tpill[data-type=\"game\"]"],["click","#panel-type button[type=submit]"],["wait",400],["fill","#f-desc","A co-op farming game where the seasons never repeat."],["click","#teamCards .tpill[data-team=\"small-team\"]"],["click","#panel-detail button[type=submit]"],["wait",900],["click","#panel-modules button[type=submit]"],["wait",400],["click","#panel-home button[type=submit]"],["wait",400],["fill","#f-slug","mercury"],["wait",900],["fill","#f-domain","mercury.example.com"],["wait",200],["click","#panel-address button[type=submit]"],["wait",400],["click","#panel-app button[type=submit]"],["wait",400],["click","#panel-look button[type=submit]"],["wait",400],["click","#doCreate"],["wait",1500]], "expect": {"visible":["#panel-done","#liveProgress .prog","#humanSteps li"],"hidden":["#panel-review","#qWrap"]} },
|
|
58
|
-
"in-new-resume-offer": { "auth": true, "url": "/projects?view=new", "actions": [["wait",600],["click","#termsAck"],["click","#panel-terms button[type=submit]"],["wait",400],["click","#panel-fork button[type=submit]"],["wait",400],["fill","#newName","Mercury"],["click","#panel-name button[type=submit]"],["wait",400],["click","#typeCards .tpill[data-type=\"game\"]"],["click","#panel-type button[type=submit]"],["wait",400],["fill","#f-desc","A co-op farming game where the seasons never repeat."],["click","#teamCards .tpill[data-team=\"small-team\"]"],["click","#panel-detail button[type=submit]"],["wait",900],["click","#panel-modules button[type=submit]"],["wait",400],["click","#panel-home button[type=submit]"],["wait",400],["fill","#f-slug","mercury"],["wait",900],["fill","#f-domain","mercury.example.com"],["wait",200],["click","#panel-address button[type=submit]"],["wait",400],["click","#panel-app button[type=submit]"],["wait",400],["click","#panel-look button[type=submit]"],["wait",400],["click","#doCreate"],["wait",1500],["click","#projTrig"],["wait",350],["click","#menuProjects [data-nav=\"new\"]"],["wait",500]], "expect": {"visible":["#panel-terms","#wizResume","#wizResumeGo"],"hidden":["#panel-done","#panel-name"],"text":[["#wizResumeName","Mercury"]]} },
|
|
51
|
+
"in-new-type": { "auth": true, "url": "/projects?view=new", "actions": [["wait",600],["click","#termsAck"],["click","#panel-terms button[type=submit]"],["wait",400],["click","#panel-fork button[type=submit]"],["wait",400],["click","#physNext"],["wait",200],["click","[data-phys=\"project_state\"][data-val=\"new\"]"],["click","#physNext"],["wait",500],["select","#physCountry","US"],["click","[data-phys=\"builder_geography\"][data-val=\"global\"]"],["click","#physNext"],["wait",200],["click","[data-phys=\"minors_on_board\"][data-val=\"false\"]"],["click","#physNext"],["wait",200],["click","[data-phys=\"entity\"][data-val=\"intent-solo\"]"],["click","#physNext"],["wait",400],["fill","#newName","Mercury"],["click","#panel-name button[type=submit]"],["wait",400]], "expect": {"visible":["#panel-type"],"hidden":["#panel-name","#qWrap"]} },
|
|
52
|
+
"in-new-about": { "auth": true, "url": "/projects?view=new", "actions": [["wait",600],["click","#termsAck"],["click","#panel-terms button[type=submit]"],["wait",400],["click","#panel-fork button[type=submit]"],["wait",400],["click","#physNext"],["wait",200],["click","[data-phys=\"project_state\"][data-val=\"new\"]"],["click","#physNext"],["wait",500],["select","#physCountry","US"],["click","[data-phys=\"builder_geography\"][data-val=\"global\"]"],["click","#physNext"],["wait",200],["click","[data-phys=\"minors_on_board\"][data-val=\"false\"]"],["click","#physNext"],["wait",200],["click","[data-phys=\"entity\"][data-val=\"intent-solo\"]"],["click","#physNext"],["wait",400],["fill","#newName","Mercury"],["click","#panel-name button[type=submit]"],["wait",400],["click","#typeCards .tpill[data-type=\"game\"]"],["click","#panel-type button[type=submit]"],["wait",400]], "expect": {"visible":["#panel-detail"],"hidden":["#panel-type","#qWrap"]} },
|
|
53
|
+
"in-new-modules": { "auth": true, "url": "/projects?view=new", "actions": [["wait",600],["click","#termsAck"],["click","#panel-terms button[type=submit]"],["wait",400],["click","#panel-fork button[type=submit]"],["wait",400],["click","#physNext"],["wait",200],["click","[data-phys=\"project_state\"][data-val=\"new\"]"],["click","#physNext"],["wait",500],["select","#physCountry","US"],["click","[data-phys=\"builder_geography\"][data-val=\"global\"]"],["click","#physNext"],["wait",200],["click","[data-phys=\"minors_on_board\"][data-val=\"false\"]"],["click","#physNext"],["wait",200],["click","[data-phys=\"entity\"][data-val=\"intent-solo\"]"],["click","#physNext"],["wait",400],["fill","#newName","Mercury"],["click","#panel-name button[type=submit]"],["wait",400],["click","#typeCards .tpill[data-type=\"game\"]"],["click","#panel-type button[type=submit]"],["wait",400],["fill","#f-desc","A co-op farming game where the seasons never repeat."],["click","#teamCards .tpill[data-team=\"small-team\"]"],["click","#panel-detail button[type=submit]"],["wait",900]], "expect": {"visible":["#panel-modules","#modQ","#modCards .tpill[aria-pressed=\"true\"]","#modCoreNote"],"hidden":["#panel-detail","#qWrap"]} },
|
|
54
|
+
"in-new-modules-search": { "auth": true, "url": "/projects?view=new", "actions": [["wait",600],["click","#termsAck"],["click","#panel-terms button[type=submit]"],["wait",400],["click","#panel-fork button[type=submit]"],["wait",400],["click","#physNext"],["wait",200],["click","[data-phys=\"project_state\"][data-val=\"new\"]"],["click","#physNext"],["wait",500],["select","#physCountry","US"],["click","[data-phys=\"builder_geography\"][data-val=\"global\"]"],["click","#physNext"],["wait",200],["click","[data-phys=\"minors_on_board\"][data-val=\"false\"]"],["click","#physNext"],["wait",200],["click","[data-phys=\"entity\"][data-val=\"intent-solo\"]"],["click","#physNext"],["wait",400],["fill","#newName","Mercury"],["click","#panel-name button[type=submit]"],["wait",400],["click","#typeCards .tpill[data-type=\"game\"]"],["click","#panel-type button[type=submit]"],["wait",400],["fill","#f-desc","A co-op farming game where the seasons never repeat."],["click","#teamCards .tpill[data-team=\"small-team\"]"],["click","#panel-detail button[type=submit]"],["wait",900],["fill","#modQ","discord"],["wait",200]], "expect": {"visible":["#panel-modules","#modQ"],"value":[["#modQ","discord"]],"count":[["#modCards .tpill",1],["#modCards .tpill[data-mod=\"discord\"]",1]],"text":[["#modFilterNote","Showing 1 of 3. 2 extras are switched on, including any this search is hiding."]]} },
|
|
55
|
+
"in-new-home": { "auth": true, "url": "/projects?view=new", "actions": [["wait",600],["click","#termsAck"],["click","#panel-terms button[type=submit]"],["wait",400],["click","#panel-fork button[type=submit]"],["wait",400],["click","#physNext"],["wait",200],["click","[data-phys=\"project_state\"][data-val=\"new\"]"],["click","#physNext"],["wait",500],["select","#physCountry","US"],["click","[data-phys=\"builder_geography\"][data-val=\"global\"]"],["click","#physNext"],["wait",200],["click","[data-phys=\"minors_on_board\"][data-val=\"false\"]"],["click","#physNext"],["wait",200],["click","[data-phys=\"entity\"][data-val=\"intent-solo\"]"],["click","#physNext"],["wait",400],["fill","#newName","Mercury"],["click","#panel-name button[type=submit]"],["wait",400],["click","#typeCards .tpill[data-type=\"game\"]"],["click","#panel-type button[type=submit]"],["wait",400],["fill","#f-desc","A co-op farming game where the seasons never repeat."],["click","#teamCards .tpill[data-team=\"small-team\"]"],["click","#panel-detail button[type=submit]"],["wait",900],["click","#panel-modules button[type=submit]"],["wait",400]], "expect": {"visible":["#panel-home"],"hidden":["#panel-detail","#qWrap"]} },
|
|
56
|
+
"in-new-address": { "auth": true, "url": "/projects?view=new", "actions": [["wait",600],["click","#termsAck"],["click","#panel-terms button[type=submit]"],["wait",400],["click","#panel-fork button[type=submit]"],["wait",400],["click","#physNext"],["wait",200],["click","[data-phys=\"project_state\"][data-val=\"new\"]"],["click","#physNext"],["wait",500],["select","#physCountry","US"],["click","[data-phys=\"builder_geography\"][data-val=\"global\"]"],["click","#physNext"],["wait",200],["click","[data-phys=\"minors_on_board\"][data-val=\"false\"]"],["click","#physNext"],["wait",200],["click","[data-phys=\"entity\"][data-val=\"intent-solo\"]"],["click","#physNext"],["wait",400],["fill","#newName","Mercury"],["click","#panel-name button[type=submit]"],["wait",400],["click","#typeCards .tpill[data-type=\"game\"]"],["click","#panel-type button[type=submit]"],["wait",400],["fill","#f-desc","A co-op farming game where the seasons never repeat."],["click","#teamCards .tpill[data-team=\"small-team\"]"],["click","#panel-detail button[type=submit]"],["wait",900],["click","#panel-modules button[type=submit]"],["wait",400],["click","#panel-home button[type=submit]"],["wait",400]], "expect": {"visible":["#panel-address"],"hidden":["#panel-home","#qWrap"]} },
|
|
57
|
+
"in-new-app": { "auth": true, "url": "/projects?view=new", "actions": [["wait",600],["click","#termsAck"],["click","#panel-terms button[type=submit]"],["wait",400],["click","#panel-fork button[type=submit]"],["wait",400],["click","#physNext"],["wait",200],["click","[data-phys=\"project_state\"][data-val=\"new\"]"],["click","#physNext"],["wait",500],["select","#physCountry","US"],["click","[data-phys=\"builder_geography\"][data-val=\"global\"]"],["click","#physNext"],["wait",200],["click","[data-phys=\"minors_on_board\"][data-val=\"false\"]"],["click","#physNext"],["wait",200],["click","[data-phys=\"entity\"][data-val=\"intent-solo\"]"],["click","#physNext"],["wait",400],["fill","#newName","Mercury"],["click","#panel-name button[type=submit]"],["wait",400],["click","#typeCards .tpill[data-type=\"game\"]"],["click","#panel-type button[type=submit]"],["wait",400],["fill","#f-desc","A co-op farming game where the seasons never repeat."],["click","#teamCards .tpill[data-team=\"small-team\"]"],["click","#panel-detail button[type=submit]"],["wait",900],["click","#panel-modules button[type=submit]"],["wait",400],["click","#panel-home button[type=submit]"],["wait",400],["fill","#f-slug","mercury"],["wait",900],["fill","#f-domain","mercury.example.com"],["wait",200],["click","#panel-address button[type=submit]"],["wait",400]], "expect": {"visible":["#panel-app","#appOpts","#appOptRender"],"hidden":["#panel-address","#panel-review","#qWrap"]} },
|
|
58
|
+
"in-new-app-render": { "auth": true, "url": "/projects?view=new", "actions": [["wait",600],["click","#termsAck"],["click","#panel-terms button[type=submit]"],["wait",400],["click","#panel-fork button[type=submit]"],["wait",400],["click","#physNext"],["wait",200],["click","[data-phys=\"project_state\"][data-val=\"new\"]"],["click","#physNext"],["wait",500],["select","#physCountry","US"],["click","[data-phys=\"builder_geography\"][data-val=\"global\"]"],["click","#physNext"],["wait",200],["click","[data-phys=\"minors_on_board\"][data-val=\"false\"]"],["click","#physNext"],["wait",200],["click","[data-phys=\"entity\"][data-val=\"intent-solo\"]"],["click","#physNext"],["wait",400],["fill","#newName","Mercury"],["click","#panel-name button[type=submit]"],["wait",400],["click","#typeCards .tpill[data-type=\"game\"]"],["click","#panel-type button[type=submit]"],["wait",400],["fill","#f-desc","A co-op farming game where the seasons never repeat."],["click","#teamCards .tpill[data-team=\"small-team\"]"],["click","#panel-detail button[type=submit]"],["wait",900],["click","#panel-modules button[type=submit]"],["wait",400],["click","#panel-home button[type=submit]"],["wait",400],["fill","#f-slug","mercury"],["wait",900],["fill","#f-domain","mercury.example.com"],["wait",200],["click","#panel-address button[type=submit]"],["wait",400],["click","#appOptRender input"],["wait",300]], "expect": {"visible":["#panel-app","#renderSetup","#f-renderKey","#renderCheck"],"hidden":["#renderWs","#renderSvc","#renderNew"]} },
|
|
59
|
+
"in-new-look": {"auth":true,"url":"/projects?view=new","actions":[["wait",600],["click","#termsAck"],["click","#panel-terms button[type=submit]"],["wait",400],["click","#panel-fork button[type=submit]"],["wait",400],["click","#physNext"],["wait",200],["click","[data-phys=\"project_state\"][data-val=\"new\"]"],["click","#physNext"],["wait",500],["select","#physCountry","US"],["click","[data-phys=\"builder_geography\"][data-val=\"global\"]"],["click","#physNext"],["wait",200],["click","[data-phys=\"minors_on_board\"][data-val=\"false\"]"],["click","#physNext"],["wait",200],["click","[data-phys=\"entity\"][data-val=\"intent-solo\"]"],["click","#physNext"],["wait",400],["fill","#newName","Mercury"],["click","#panel-name button[type=submit]"],["wait",400],["click","#typeCards .tpill[data-type=\"game\"]"],["click","#panel-type button[type=submit]"],["wait",400],["fill","#f-desc","A co-op farming game where the seasons never repeat."],["click","#teamCards .tpill[data-team=\"small-team\"]"],["click","#panel-detail button[type=submit]"],["wait",900],["click","#panel-modules button[type=submit]"],["wait",400],["click","#panel-home button[type=submit]"],["wait",400],["fill","#f-slug","mercury"],["wait",900],["fill","#f-domain","mercury.example.com"],["wait",200],["click","#panel-address button[type=submit]"],["wait",400],["click","#panel-app button[type=submit]"],["wait",400]],"expect":{"visible":["#panel-look","#wizLook","#wizLook-chrome-world","#wizTint","#wizLogo",".lookPrev .mh.light",".lookPrev .mh.dark"],"hidden":["#panel-app","#panel-review"]}},
|
|
60
|
+
"in-new-look-custom": {"auth":true,"url":"/projects?view=new","actions":[["wait",600],["click","#termsAck"],["click","#panel-terms button[type=submit]"],["wait",400],["click","#panel-fork button[type=submit]"],["wait",400],["click","#physNext"],["wait",200],["click","[data-phys=\"project_state\"][data-val=\"new\"]"],["click","#physNext"],["wait",500],["select","#physCountry","US"],["click","[data-phys=\"builder_geography\"][data-val=\"global\"]"],["click","#physNext"],["wait",200],["click","[data-phys=\"minors_on_board\"][data-val=\"false\"]"],["click","#physNext"],["wait",200],["click","[data-phys=\"entity\"][data-val=\"intent-solo\"]"],["click","#physNext"],["wait",400],["fill","#newName","Mercury"],["click","#panel-name button[type=submit]"],["wait",400],["click","#typeCards .tpill[data-type=\"game\"]"],["click","#panel-type button[type=submit]"],["wait",400],["fill","#f-desc","A co-op farming game where the seasons never repeat."],["click","#teamCards .tpill[data-team=\"small-team\"]"],["click","#panel-detail button[type=submit]"],["wait",900],["click","#panel-modules button[type=submit]"],["wait",400],["click","#panel-home button[type=submit]"],["wait",400],["fill","#f-slug","mercury"],["wait",900],["fill","#f-domain","mercury.example.com"],["wait",200],["click","#panel-address button[type=submit]"],["wait",400],["click","#panel-app button[type=submit]"],["wait",400],["click","#wizLook-custom"],["wait",200]],"expect":{"visible":["#panel-look","#wizAccent","#wizAccentNote"],"hidden":["#panel-review"]}},
|
|
61
|
+
"in-new-review": { "auth": true, "url": "/projects?view=new", "actions": [["wait",600],["click","#termsAck"],["click","#panel-terms button[type=submit]"],["wait",400],["click","#panel-fork button[type=submit]"],["wait",400],["click","#physNext"],["wait",200],["click","[data-phys=\"project_state\"][data-val=\"new\"]"],["click","#physNext"],["wait",500],["select","#physCountry","US"],["click","[data-phys=\"builder_geography\"][data-val=\"global\"]"],["click","#physNext"],["wait",200],["click","[data-phys=\"minors_on_board\"][data-val=\"false\"]"],["click","#physNext"],["wait",200],["click","[data-phys=\"entity\"][data-val=\"intent-solo\"]"],["click","#physNext"],["wait",400],["fill","#newName","Mercury"],["click","#panel-name button[type=submit]"],["wait",400],["click","#typeCards .tpill[data-type=\"game\"]"],["click","#panel-type button[type=submit]"],["wait",400],["fill","#f-desc","A co-op farming game where the seasons never repeat."],["click","#teamCards .tpill[data-team=\"small-team\"]"],["click","#panel-detail button[type=submit]"],["wait",900],["click","#panel-modules button[type=submit]"],["wait",400],["click","#panel-home button[type=submit]"],["wait",400],["fill","#f-slug","mercury"],["wait",900],["fill","#f-domain","mercury.example.com"],["wait",200],["click","#panel-address button[type=submit]"],["wait",400],["click","#panel-app button[type=submit]"],["wait",400],["click","#panel-look button[type=submit]"],["wait",400]], "expect": {"visible":["#panel-review","#reviewList li"],"hidden":["#panel-address","#qWrap"]} },
|
|
62
|
+
"in-new-done": { "auth": true, "url": "/projects?view=new", "actions": [["wait",600],["click","#termsAck"],["click","#panel-terms button[type=submit]"],["wait",400],["click","#panel-fork button[type=submit]"],["wait",400],["click","#physNext"],["wait",200],["click","[data-phys=\"project_state\"][data-val=\"new\"]"],["click","#physNext"],["wait",500],["select","#physCountry","US"],["click","[data-phys=\"builder_geography\"][data-val=\"global\"]"],["click","#physNext"],["wait",200],["click","[data-phys=\"minors_on_board\"][data-val=\"false\"]"],["click","#physNext"],["wait",200],["click","[data-phys=\"entity\"][data-val=\"intent-solo\"]"],["click","#physNext"],["wait",400],["fill","#newName","Mercury"],["click","#panel-name button[type=submit]"],["wait",400],["click","#typeCards .tpill[data-type=\"game\"]"],["click","#panel-type button[type=submit]"],["wait",400],["fill","#f-desc","A co-op farming game where the seasons never repeat."],["click","#teamCards .tpill[data-team=\"small-team\"]"],["click","#panel-detail button[type=submit]"],["wait",900],["click","#panel-modules button[type=submit]"],["wait",400],["click","#panel-home button[type=submit]"],["wait",400],["fill","#f-slug","mercury"],["wait",900],["fill","#f-domain","mercury.example.com"],["wait",200],["click","#panel-address button[type=submit]"],["wait",400],["click","#panel-app button[type=submit]"],["wait",400],["click","#panel-look button[type=submit]"],["wait",400],["click","#doCreate"],["wait",1500]], "expect": {"visible":["#panel-done","#liveProgress .prog","#humanSteps li"],"hidden":["#panel-review","#qWrap"]} },
|
|
63
|
+
"in-new-resume-offer": { "auth": true, "url": "/projects?view=new", "actions": [["wait",600],["click","#termsAck"],["click","#panel-terms button[type=submit]"],["wait",400],["click","#panel-fork button[type=submit]"],["wait",400],["click","#physNext"],["wait",200],["click","[data-phys=\"project_state\"][data-val=\"new\"]"],["click","#physNext"],["wait",500],["select","#physCountry","US"],["click","[data-phys=\"builder_geography\"][data-val=\"global\"]"],["click","#physNext"],["wait",200],["click","[data-phys=\"minors_on_board\"][data-val=\"false\"]"],["click","#physNext"],["wait",200],["click","[data-phys=\"entity\"][data-val=\"intent-solo\"]"],["click","#physNext"],["wait",400],["fill","#newName","Mercury"],["click","#panel-name button[type=submit]"],["wait",400],["click","#typeCards .tpill[data-type=\"game\"]"],["click","#panel-type button[type=submit]"],["wait",400],["fill","#f-desc","A co-op farming game where the seasons never repeat."],["click","#teamCards .tpill[data-team=\"small-team\"]"],["click","#panel-detail button[type=submit]"],["wait",900],["click","#panel-modules button[type=submit]"],["wait",400],["click","#panel-home button[type=submit]"],["wait",400],["fill","#f-slug","mercury"],["wait",900],["fill","#f-domain","mercury.example.com"],["wait",200],["click","#panel-address button[type=submit]"],["wait",400],["click","#panel-app button[type=submit]"],["wait",400],["click","#panel-look button[type=submit]"],["wait",400],["click","#doCreate"],["wait",1500],["click","#projTrig"],["wait",350],["click","#menuProjects [data-nav=\"new\"]"],["wait",500]], "expect": {"visible":["#panel-terms","#wizResume","#wizResumeGo"],"hidden":["#panel-done","#panel-name"],"text":[["#wizResumeName","Mercury"]]} },
|
|
59
64
|
"out-map-projects": { "auth": false, "actions": [["click", "#projTrig"], ["wait", 350]], "expect": { "expanded": true, "hidden": ["#menuProjects [data-nav=\"mine\"]"] } },
|
|
60
65
|
"card": { "auth": true, "actions": [["dispatchClick", "#orbField a.worldOrb[data-origin=\"https://example.com\"]"], ["wait", 900]], "expect": { "dialog": true, "hasClass": [["#projCard", "has-art"]], "visible": ["#cardArt", "#cardFaces", "#cardBuildersFig", "#cardShippedFig", "#cardOpen", "#cardHall"], "text": [["#cardBuilders", "11"], ["#cardShipped", "0"], ["#cardRel", "you build here"], ["#cardRuns", "example.com"], ["#cardFaces .facesMore", "+6"]], "count": [["#cardFaces img", 5]], "href": [["#cardHall", "https://builders.example.com/"]] } },
|
|
61
66
|
"card-noart": { "auth": true, "actions": [["dispatchClick", "#orbField a.worldOrb[data-origin=\"https://emersonian-circles.cloudbongos.com\"]"], ["wait", 600]], "expect": { "dialog": true, "hasClass": [["#projCard", "has-art", false]], "hidden": ["#cardArt", "#cardFaces", "#cardHall"], "visible": ["#cardBuildersFig", "#cardShippedFig", "#cardOpen"], "text": [["#cardShipped", "30+"], ["#cardRel", "you build here"]] } },
|
|
@@ -83,7 +83,7 @@ function sidecarPath(surfaceDir, urlPath, kind) { return path.join(surfaceDir, `
|
|
|
83
83
|
function readJson(file) { return JSON.parse(fs.readFileSync(file, 'utf8')); }
|
|
84
84
|
|
|
85
85
|
// ── the action vocabulary (states + probes) ───────────────────────────────────
|
|
86
|
-
const ACTIONS = Object.freeze(['click', 'focus', 'press', 'fill', 'wait', 'clickAt', 'clickIfVisible', 'dispatchClick', 'check', 'back', 'forward']);
|
|
86
|
+
const ACTIONS = Object.freeze(['click', 'focus', 'press', 'fill', 'wait', 'clickAt', 'clickIfVisible', 'dispatchClick', 'check', 'select', 'back', 'forward']);
|
|
87
87
|
function validateActions(actions, at) {
|
|
88
88
|
if (actions === undefined) return [];
|
|
89
89
|
if (!Array.isArray(actions)) return [`${at}: an array of [op, ...args]`];
|
|
@@ -92,7 +92,7 @@ function validateActions(actions, at) {
|
|
|
92
92
|
const arr = Array.isArray(step) ? step : [step];
|
|
93
93
|
const [op, a, b] = arr;
|
|
94
94
|
if (!ACTIONS.includes(op)) { errors.push(`${at}[${i}]: unknown action "${op}" (one of ${ACTIONS.join(', ')})`); return; }
|
|
95
|
-
if (['click', 'focus', 'fill', 'clickIfVisible', 'dispatchClick', 'check'].includes(op) && typeof a !== 'string') errors.push(`${at}[${i}]: ${op} needs a selector`);
|
|
95
|
+
if (['click', 'focus', 'fill', 'clickIfVisible', 'dispatchClick', 'check', 'select'].includes(op) && typeof a !== 'string') errors.push(`${at}[${i}]: ${op} needs a selector`);
|
|
96
96
|
if (op === 'press' && typeof a !== 'string') errors.push(`${at}[${i}]: press needs a key`);
|
|
97
97
|
if (op === 'wait' && !(Number(a) >= 0)) errors.push(`${at}[${i}]: wait needs milliseconds`);
|
|
98
98
|
if (op === 'clickAt' && !(Number(a) >= 0 && Number(b) >= 0)) errors.push(`${at}[${i}]: clickAt needs x y`);
|
|
@@ -120,6 +120,8 @@ async function runActions(page, actions = []) {
|
|
|
120
120
|
case 'check':
|
|
121
121
|
await page.evaluate(([s, on]) => { const el = document.querySelector(s); if (!el) throw new Error('check: nothing matches ' + s); el.checked = on !== false; el.dispatchEvent(new Event('change', { bubbles: true })); }, [a, b]);
|
|
122
122
|
break;
|
|
123
|
+
// a <select>'s option by value (task 1004418: the wizard's country picker); fill cannot set one
|
|
124
|
+
case 'select': await page.selectOption(a, b == null ? '' : String(b)); break;
|
|
123
125
|
case 'back': await page.goBack(); break;
|
|
124
126
|
case 'forward': await page.goForward(); break;
|
|
125
127
|
default: throw new Error(`unknown action "${op}"`);
|
|
@@ -443,6 +443,11 @@ const server = http.createServer((req, res) => {
|
|
|
443
443
|
if (rest === '/me/profile' && req.method === 'PATCH') return AUTH ? readBody(req, (body) => profilePatch(res, body)) : json(res, 401, UNAUTH);
|
|
444
444
|
if (rest === '/me/handle' && req.method === 'PATCH') return AUTH ? readBody(req, (body) => handlePatch(res, body)) : json(res, 401, UNAUTH);
|
|
445
445
|
if (rest === '/provisioning/instances' && req.method === 'GET') return AUTH ? instances(res, null, false) : json(res, 401, UNAUTH);
|
|
446
|
+
// the planet-physics questions' pre-create check (task 1004418): nothing stops and no
|
|
447
|
+
// option is limited here — the kit carries neither the server's screen nor its table
|
|
448
|
+
if (rest === '/provisioning/physics-check' && req.method === 'POST') {
|
|
449
|
+
return AUTH ? json(res, 200, { stop: false, message: null, soft_limits: { enforced: false, limits: [] } }) : json(res, 401, UNAUTH);
|
|
450
|
+
}
|
|
446
451
|
// where a project's app runs (task 1004353): the status read, from a fixture keyed by
|
|
447
452
|
// project id — a project the fixture does not name has no platform chosen
|
|
448
453
|
const appRead = rest.match(/^\/provisioning\/instances\/(\d+)\/render$/);
|
package/package-lock.json
CHANGED
|
@@ -1,12 +1,12 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@bongos/core",
|
|
3
|
-
"version": "1.20.
|
|
3
|
+
"version": "1.20.76",
|
|
4
4
|
"lockfileVersion": 3,
|
|
5
5
|
"requires": true,
|
|
6
6
|
"packages": {
|
|
7
7
|
"": {
|
|
8
8
|
"name": "@bongos/core",
|
|
9
|
-
"version": "1.20.
|
|
9
|
+
"version": "1.20.76",
|
|
10
10
|
"license": "AGPL-3.0-or-later",
|
|
11
11
|
"dependencies": {
|
|
12
12
|
"express": "^4.21.2",
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@bongos/core",
|
|
3
|
-
"version": "1.20.
|
|
3
|
+
"version": "1.20.76",
|
|
4
4
|
"description": "Cloud Bongos — the AI-first build platform core (GDS + platform surfaces + module system), installed as a versioned dependency (ADR 0108).",
|
|
5
5
|
"license": "AGPL-3.0-or-later",
|
|
6
6
|
"main": "src/platform-server.js",
|
package/release-notes.json
CHANGED
|
@@ -8573,5 +8573,17 @@
|
|
|
8573
8573
|
"id": "1003796",
|
|
8574
8574
|
"text": "Nobody can change a module's score by hand. Senior builders can ask for a module to be checked again, with a reason, and the score updates from the fresh check."
|
|
8575
8575
|
}
|
|
8576
|
+
],
|
|
8577
|
+
"1.20.75": [
|
|
8578
|
+
{
|
|
8579
|
+
"id": "1004418",
|
|
8580
|
+
"text": "Creating a project now starts with four questions about its \"planet physics\": is it new or already started, where is everyone, will anyone under 18 be building, and what kind of entity is behind it. A planet forms beside the q"
|
|
8581
|
+
}
|
|
8582
|
+
],
|
|
8583
|
+
"1.20.76": [
|
|
8584
|
+
{
|
|
8585
|
+
"id": "1004434",
|
|
8586
|
+
"text": "A profile now leads with the person's own work. An artist's page opens on pages approved, this week's gain and how many pages of each part of the site they have tweaked; an ideator's on thoughts filed, how many became work, Fu"
|
|
8587
|
+
}
|
|
8576
8588
|
]
|
|
8577
8589
|
}
|
package/src/module-api.js
CHANGED
|
@@ -75,7 +75,7 @@ const { responsibilityFor, ROLE_RESPONSIBILITIES } = require('./role-responsibil
|
|
|
75
75
|
// MAJOR (see allowBoxScope below): passes the request through untouched.
|
|
76
76
|
function deprecatedNoopMiddleware(_req, _res, next) { next(); }
|
|
77
77
|
|
|
78
|
-
const CORE_VERSION = '1.20.
|
|
78
|
+
const CORE_VERSION = '1.20.76'; // CI auto-patch carrier (ADR 0161); changelog: docs/module-api-changelog.md
|
|
79
79
|
|
|
80
80
|
// A namespaced logger so a module's log lines are attributable + consistent.
|
|
81
81
|
// Usage: const log = api.logger('discord'); log.info('mounted');
|
|
@@ -251,7 +251,8 @@ test('a project that was never founded keeps the wall hidden', async () => {
|
|
|
251
251
|
test('the profile and the ranks page read the same list, and every page loads the script first', () => {
|
|
252
252
|
const profile = read('profile.js');
|
|
253
253
|
const ranks = read('ranks.js');
|
|
254
|
-
|
|
254
|
+
// renderHead takes the role headline since task 1004434; the mark still follows it.
|
|
255
|
+
assert.match(profile, /renderHead\(builder(?:, view)?\);\s*\n\s*renderFoundingMark\(builder\);/);
|
|
255
256
|
assert.match(ranks, /render\(builder \|\| \{\}\);\s*\n\s*renderFounding\(\);/);
|
|
256
257
|
assert.match(read('ranks.html'), /id="founding-scroll"[^>]*hidden/, 'the ranks section is hidden in the markup');
|
|
257
258
|
for (const [html, page] of [['roster.html', 'roster.js'], ['profile.html', 'profile.js'], ['ranks.html', 'ranks.js'], ['index.html', 'hall-widgets.js']]) {
|
package/tests/helpers.mjs
CHANGED
|
@@ -517,6 +517,7 @@ export function shallowCloneReason(root = ROOT) {
|
|
|
517
517
|
// page that changes, so the harness moved here and the fixture stayed with
|
|
518
518
|
// each caller — is the /inbox/by-builder/ payload to answer with.
|
|
519
519
|
const PROFILE_JS = fs.readFileSync(path.join(ROOT, 'modules/hall-ui/public/profile.js'), 'utf8');
|
|
520
|
+
const PROFILE_ROLES_JS = fs.readFileSync(path.join(ROOT, 'modules/hall-ui/public/profile-roles.js'), 'utf8');
|
|
520
521
|
// Boot the REAL profile.js against a stub DOM + a stub OTBKit that captures each
|
|
521
522
|
// ledger's rowHtml, and return what it rendered plus every request it made.
|
|
522
523
|
export function bootProfilePage({ signedIn = true, trail = [] } = {}) {
|
|
@@ -623,6 +624,9 @@ export function bootProfilePage({ signedIn = true, trail = [] } = {}) {
|
|
|
623
624
|
};
|
|
624
625
|
sandbox.globalThis = sandbox;
|
|
625
626
|
vm.createContext(sandbox);
|
|
627
|
+
// profile.js draws the header from profile-roles.js (task 1004434), which the
|
|
628
|
+
// page loads first.
|
|
629
|
+
vm.runInContext(PROFILE_ROLES_JS, sandbox, { filename: 'profile-roles.js' });
|
|
626
630
|
vm.runInContext(PROFILE_JS, sandbox, { filename: 'profile.js' });
|
|
627
631
|
|
|
628
632
|
const htmlFor = (mountId) => {
|
|
@@ -0,0 +1,201 @@
|
|
|
1
|
+
// tests/profile_role_headline.mjs — the profile's header and "By the numbers"
|
|
2
|
+
// lead with each person's own craft (task 1004434 / WA6.RP04, goal 1000095,
|
|
3
|
+
// criterion wa6-roles-read-true-in-public).
|
|
4
|
+
//
|
|
5
|
+
// The done-when: "engineer, artist and ideator fixtures each render their own
|
|
6
|
+
// headline, matching the mock". Three layers, each run for real:
|
|
7
|
+
//
|
|
8
|
+
// 1. The words. profile-roles.js (pure) over the three harness fixtures the
|
|
9
|
+
// renders were taken from: each craft's tally, tiles and subtitle.
|
|
10
|
+
// 2. The page. The REAL profile.js in a vm, with the REAL hall kit, over the
|
|
11
|
+
// same fixtures: what lands in the header, the numbers and the subtitle.
|
|
12
|
+
// 3. The whole path. The REAL server reader (src/bongos/role-stats.js) with
|
|
13
|
+
// the three role ports stubbed, through JSON, into the REAL page, so a field
|
|
14
|
+
// the server renames or drops cannot leave this suite green on a fixture
|
|
15
|
+
// that still carries it.
|
|
16
|
+
|
|
17
|
+
import { strict as assert } from 'node:assert';
|
|
18
|
+
import { createRequire } from 'node:module';
|
|
19
|
+
import fs from 'node:fs';
|
|
20
|
+
import path from 'node:path';
|
|
21
|
+
import vm from 'node:vm';
|
|
22
|
+
import { fileURLToPath } from 'node:url';
|
|
23
|
+
import { makeRunner } from './helpers.mjs';
|
|
24
|
+
|
|
25
|
+
process.env.NODE_ENV = 'test';
|
|
26
|
+
const require = createRequire(import.meta.url);
|
|
27
|
+
const ROOT = fileURLToPath(new URL('..', import.meta.url));
|
|
28
|
+
const FIX = (n) => JSON.parse(fs.readFileSync(path.join(ROOT, 'scripts/hall-preview/fixtures', n + '.json'), 'utf8'));
|
|
29
|
+
|
|
30
|
+
const { headline } = require('../modules/hall-ui/public/profile-roles.js');
|
|
31
|
+
const OTBKit = require('../modules/hall-ui/public/hall-kit.js');
|
|
32
|
+
const ROLES_SRC = fs.readFileSync(path.join(ROOT, 'modules/hall-ui/public/profile-roles.js'), 'utf8');
|
|
33
|
+
const PAGE_SRC = fs.readFileSync(path.join(ROOT, 'modules/hall-ui/public/profile.js'), 'utf8');
|
|
34
|
+
|
|
35
|
+
const ENGINEER = FIX('builders__profile');
|
|
36
|
+
const ARTIST = FIX('builders__2001__profile');
|
|
37
|
+
const IDEATOR = FIX('builders__2002__profile');
|
|
38
|
+
const OPTS = { fmt: (n) => Number(n).toLocaleString('en-US'), currency: 'credits', rank: 'Contributor' };
|
|
39
|
+
const words = (items) => items.map((t) => `${t.n} ${t.w}`);
|
|
40
|
+
|
|
41
|
+
const { test, summary } = makeRunner();
|
|
42
|
+
|
|
43
|
+
// ---- 1. the words --------------------------------------------------------
|
|
44
|
+
|
|
45
|
+
await test('an engineer leads with works shipped, and keeps karma', () => {
|
|
46
|
+
const v = headline(ENGINEER, OPTS);
|
|
47
|
+
assert.deepEqual(words(v.tally), ['4,630 credits', '24 works shipped', '1 karma']);
|
|
48
|
+
assert.deepEqual(words(v.tiles).slice(0, 4), ['24 works shipped', '4,630 credits', '1 karma', '2 achievements']);
|
|
49
|
+
assert.equal(v.sub, 'Builder 4 — Contributor · 24 works shipped');
|
|
50
|
+
assert.deepEqual(v.surfaces, [], 'the per-surface rows are the artist\'s');
|
|
51
|
+
});
|
|
52
|
+
|
|
53
|
+
await test('an artist who never shipped a task leads with pages approved and the per-surface share', () => {
|
|
54
|
+
const v = headline(ARTIST, OPTS);
|
|
55
|
+
assert.deepEqual(words(v.tally), ['412 credits', '9 pages approved', '+38 this week']);
|
|
56
|
+
assert.deepEqual(words(v.tiles), ['9 pages approved', '270 credits from pages', '+38 this week', '4 thoughts filed', '6 karma']);
|
|
57
|
+
assert.equal(v.tiles[0].f, '3 surfaces');
|
|
58
|
+
assert.equal(v.sub, 'Builder 7 — Contributor · 9 pages approved');
|
|
59
|
+
assert.ok(!v.sub.includes('works shipped'), 'the subtitle no longer says works shipped for an artist');
|
|
60
|
+
assert.deepEqual(v.surfaces.map((s) => s.line), ['6 of 12 tweaked', '2 of 19 tweaked', '1 of 6 tweaked']);
|
|
61
|
+
assert.ok(!words(v.tiles).some((w) => /works shipped/.test(w)), 'no engineer figure on an artist\'s numbers');
|
|
62
|
+
assert.equal(words(v.tiles).at(-1), '6 karma', 'karma ends every non-engineer set (the owner, 2026-10-01)');
|
|
63
|
+
});
|
|
64
|
+
|
|
65
|
+
await test('an ideator leads with thoughts, size and what is still alive', () => {
|
|
66
|
+
const v = headline(IDEATOR, OPTS);
|
|
67
|
+
assert.deepEqual(words(v.tally), ['186 credits', '31 thoughts filed', '7 ignited']);
|
|
68
|
+
assert.deepEqual(words(v.tiles), ['31 thoughts filed', '7 ignited', '3 Full Ideas', '186~ total size', '72% still alive', '3 karma']);
|
|
69
|
+
assert.equal(v.tiles[2].f, '1 ratified by the board');
|
|
70
|
+
assert.match(v.tiles[3].title, /Includes 24 credits of historical estimate/, 'the ~ says what it means');
|
|
71
|
+
assert.equal(v.sub, 'Builder 9 — Contributor · 31 thoughts filed');
|
|
72
|
+
});
|
|
73
|
+
|
|
74
|
+
await test('several crafts each show, main first, in the server\'s order', () => {
|
|
75
|
+
assert.deepEqual(headline(ARTIST, OPTS).crafts.map((c) => c.label), ['Artist, main role', 'Ideator']);
|
|
76
|
+
assert.deepEqual(headline(ENGINEER, OPTS).crafts.map((c) => c.label), ['Engineer, main role', 'Ideator']);
|
|
77
|
+
// The other craft adds its one headline tile after the main craft's set.
|
|
78
|
+
assert.equal(words(headline(ENGINEER, OPTS).tiles).at(-1), '9 thoughts filed');
|
|
79
|
+
const reordered = { ...ARTIST, roles: { ...ARTIST.roles, main: 'ideator', shown: ['ideator', 'artist'] } };
|
|
80
|
+
const v = headline(reordered, OPTS);
|
|
81
|
+
assert.deepEqual(v.crafts.map((c) => c.label), ['Ideator, main role', 'Artist']);
|
|
82
|
+
assert.equal(words(v.tiles).at(-2), '9 pages approved', 'the other craft\'s tile, just before karma');
|
|
83
|
+
assert.deepEqual(v.surfaces, [], 'the per-surface rows follow the MAIN craft, not any craft');
|
|
84
|
+
});
|
|
85
|
+
|
|
86
|
+
await test('a number the instance could not read is a dash, never a zero', () => {
|
|
87
|
+
const noDesk = { ...ARTIST, roles: { ...ARTIST.roles, artist: { pages_approved: null, credits: null, this_week: null, surfaces_touched: null, surfaces: [], unavailable: true } } };
|
|
88
|
+
const v = headline(noDesk, OPTS);
|
|
89
|
+
assert.deepEqual(words(v.tally).slice(1), ['— pages approved', '— this week']);
|
|
90
|
+
assert.equal(v.tiles[0].f, '', 'no "0 surfaces" under an unknown count');
|
|
91
|
+
const noWork = { ...IDEATOR, roles: { ...IDEATOR.roles, ideator: { ...IDEATOR.roles.ideator, alive: { share: null, has_work: false, attributable: null } } } };
|
|
92
|
+
assert.deepEqual(headline(noWork, OPTS).tiles.at(-2), { n: '—', w: 'still alive', f: 'nothing has come of them yet' });
|
|
93
|
+
const untraced = { ...IDEATOR, roles: { ...IDEATOR.roles, ideator: { ...IDEATOR.roles.ideator, alive: { share: null, has_work: true, attributable: false } } } };
|
|
94
|
+
assert.equal(headline(untraced, OPTS).tiles.at(-2).f, 'not measurable yet');
|
|
95
|
+
});
|
|
96
|
+
|
|
97
|
+
await test('a response from before the roles block reads as the engineer it always was', () => {
|
|
98
|
+
const { roles, ...old } = ENGINEER;
|
|
99
|
+
const v = headline(old, OPTS);
|
|
100
|
+
assert.deepEqual(v.crafts.map((c) => c.label), ['Engineer, main role']);
|
|
101
|
+
assert.equal(v.sub, 'Builder 4 — Contributor · 24 works shipped');
|
|
102
|
+
});
|
|
103
|
+
|
|
104
|
+
// ---- 2. the page ---------------------------------------------------------
|
|
105
|
+
|
|
106
|
+
async function boot(profileData) {
|
|
107
|
+
const els = new Map();
|
|
108
|
+
const makeEl = () => ({
|
|
109
|
+
hidden: false, textContent: '', _html: '', dataset: {}, style: {},
|
|
110
|
+
set innerHTML(v) { this._html = String(v); }, get innerHTML() { return this._html; },
|
|
111
|
+
insertAdjacentHTML() {}, addEventListener() {}, setAttribute() {}, querySelector: () => null, querySelectorAll: () => [],
|
|
112
|
+
classList: { add() {}, remove() {}, toggle() {} },
|
|
113
|
+
});
|
|
114
|
+
const $ = (sel) => { if (!els.has(sel)) els.set(sel, makeEl()); return els.get(sel); };
|
|
115
|
+
const escapeHtml = (s) => String(s).replace(/&/g, '&').replace(/</g, '<').replace(/>/g, '>').replace(/"/g, '"');
|
|
116
|
+
const json = JSON.parse(JSON.stringify(profileData)); // what the wire carries
|
|
117
|
+
const api = {
|
|
118
|
+
async request(_m, url) {
|
|
119
|
+
if (url === '/api/bongos/me') return { status: 401, ok: false, data: null };
|
|
120
|
+
if (/\/builders\/[^/]+\/profile$/.test(url)) return { status: 200, ok: true, data: json };
|
|
121
|
+
return { status: 404, ok: false, data: null };
|
|
122
|
+
},
|
|
123
|
+
};
|
|
124
|
+
const windowObj = {
|
|
125
|
+
__BRANDING__: { currency: { label: 'credits' } },
|
|
126
|
+
__MODULES__: { responsibilities: { engineer: 'E.', artist: 'A.', ideator: 'I.' } },
|
|
127
|
+
BongosClient: { createClient: () => api },
|
|
128
|
+
// The real kit draws the surface bars; the section rail needs a real DOM and
|
|
129
|
+
// is not what this suite is about, so it is left out (profile.js skips it).
|
|
130
|
+
OTBKit: { ...OTBKit, makeSectionRail: undefined },
|
|
131
|
+
OTB: {
|
|
132
|
+
$, escapeHtml,
|
|
133
|
+
fmtNum: (n) => Number(n || 0).toLocaleString('en-US'),
|
|
134
|
+
fmtDate: (d) => String(d).slice(0, 10),
|
|
135
|
+
rankLabel: () => 'Contributor',
|
|
136
|
+
roleAxisLabel: () => 'Role', roleLabel: (d) => d, roleIsUnset: (d) => !d, toast() {},
|
|
137
|
+
},
|
|
138
|
+
};
|
|
139
|
+
const sandbox = {
|
|
140
|
+
window: windowObj, location: { search: '?id=' + profileData.builder.id, hash: '' }, URLSearchParams, console,
|
|
141
|
+
document: { querySelector: () => null, querySelectorAll: () => [], addEventListener() {} },
|
|
142
|
+
addEventListener() {}, history: { replaceState() {} },
|
|
143
|
+
};
|
|
144
|
+
sandbox.globalThis = sandbox;
|
|
145
|
+
vm.createContext(sandbox);
|
|
146
|
+
vm.runInContext(ROLES_SRC, sandbox, { filename: 'profile-roles.js' });
|
|
147
|
+
vm.runInContext(PAGE_SRC, sandbox, { filename: 'profile.js' });
|
|
148
|
+
for (let i = 0; i < 6; i++) await new Promise((r) => setImmediate(r));
|
|
149
|
+
return { head: $('#profile-head').innerHTML, nums: $('#numbers-body').innerHTML, sub: $('#profile-sub').textContent };
|
|
150
|
+
}
|
|
151
|
+
const text = (html) => html.replace(/<[^>]+>/g, ' ').replace(/\s+/g, ' ').trim();
|
|
152
|
+
|
|
153
|
+
await test('the real page draws the artist\'s tally, chips, tiles and surface rows', async () => {
|
|
154
|
+
const p = await boot(ARTIST);
|
|
155
|
+
assert.equal(p.sub, 'Builder 7 — Contributor · 9 pages approved');
|
|
156
|
+
assert.match(text(p.head), /Artist, main role Ideator/);
|
|
157
|
+
assert.match(text(p.head), /412 credits 9 pages approved \+38 this week/);
|
|
158
|
+
assert.match(p.head, /Answerable for:/, 'the responsibility line stays');
|
|
159
|
+
assert.match(text(p.nums), /^9 pages approved 3 surfaces 270 credits from pages \+38 this week 4 thoughts filed 1 ignited/);
|
|
160
|
+
assert.equal((p.nums.match(/kit-bars__row/g) || []).length, 3, 'one kit bar row per surface');
|
|
161
|
+
assert.match(text(p.nums), /Landing 6 of 12 tweaked/);
|
|
162
|
+
assert.ok(!/works shipped/i.test(p.sub + p.head + p.nums), 'nothing on an artist\'s header says works shipped');
|
|
163
|
+
});
|
|
164
|
+
|
|
165
|
+
await test('the real page draws the ideator\'s and the engineer\'s own headlines', async () => {
|
|
166
|
+
const i = await boot(IDEATOR);
|
|
167
|
+
assert.match(text(i.head), /186 credits 31 thoughts filed 7 ignited/);
|
|
168
|
+
assert.match(text(i.nums), /186~ total size/);
|
|
169
|
+
assert.match(text(i.nums), /72% still alive/);
|
|
170
|
+
assert.ok(!i.nums.includes('kit-bars'), 'no surface rows for an ideator');
|
|
171
|
+
const e = await boot({ ...ENGINEER, recent_ships: [] }); // the works ledger is not this suite's
|
|
172
|
+
assert.equal(e.sub, 'Builder 4 — Contributor · 24 works shipped');
|
|
173
|
+
assert.match(text(e.head), /4,630 credits 24 works shipped 1 karma/);
|
|
174
|
+
});
|
|
175
|
+
|
|
176
|
+
// ---- 3. the whole path ----------------------------------------------------
|
|
177
|
+
|
|
178
|
+
await test('the server\'s roles block, through JSON, renders the artist\'s headline', async () => {
|
|
179
|
+
const seams = require('../src/module-seams.js');
|
|
180
|
+
const { readRoleStats } = require('../src/bongos/role-stats.js');
|
|
181
|
+
seams._reset();
|
|
182
|
+
seams.registerProvider('reward', {
|
|
183
|
+
craftForPreference: (d) => ({ engineer: 'engineer', artist: 'artist', ui: 'artist', ideator: 'ideator' }[d] || null),
|
|
184
|
+
async creditsByCraft(ids) { return new Map([[String(ids[0]), { engineer: 0, artist: 370, ideator: 42, other: 0, total: 412 }]]); },
|
|
185
|
+
});
|
|
186
|
+
seams.registerProvider('copy-desk.artistStats', async () => ARTIST.roles.artist);
|
|
187
|
+
seams.registerProvider('ideas.ideatorStats', async () => ARTIST.roles.ideator);
|
|
188
|
+
const roles = await readRoleStats('2001', {
|
|
189
|
+
shippedCount: 0,
|
|
190
|
+
getRoleChoice: async () => ({ main_discipline: 'artist', preferred_disciplines: ['artist', 'ideator'] }),
|
|
191
|
+
});
|
|
192
|
+
seams._reset();
|
|
193
|
+
const { roles: _fixture, ...rest } = ARTIST;
|
|
194
|
+
const p = await boot({ ...rest, roles });
|
|
195
|
+
assert.equal(p.sub, 'Builder 7 — Contributor · 9 pages approved');
|
|
196
|
+
assert.match(text(p.head), /Artist, main role Ideator/);
|
|
197
|
+
assert.match(text(p.head), /412 credits 9 pages approved \+38 this week/);
|
|
198
|
+
assert.equal((p.nums.match(/kit-bars__row/g) || []).length, 3);
|
|
199
|
+
});
|
|
200
|
+
|
|
201
|
+
summary();
|
|
@@ -29,6 +29,7 @@ import { fileURLToPath } from 'node:url';
|
|
|
29
29
|
|
|
30
30
|
const ROOT = path.resolve(path.dirname(fileURLToPath(import.meta.url)), '..');
|
|
31
31
|
const SRC = fs.readFileSync(path.join(ROOT, 'modules/hall-ui/public/profile.js'), 'utf8');
|
|
32
|
+
const ROLES_SRC = fs.readFileSync(path.join(ROOT, 'modules/hall-ui/public/profile-roles.js'), 'utf8');
|
|
32
33
|
const HTML = fs.readFileSync(path.join(ROOT, 'modules/hall-ui/public/profile.html'), 'utf8');
|
|
33
34
|
|
|
34
35
|
// ---- fixtures -------------------------------------------------------------
|
|
@@ -98,6 +99,8 @@ async function boot({ search = '', me, profile } = {}) {
|
|
|
98
99
|
};
|
|
99
100
|
sandbox.globalThis = sandbox;
|
|
100
101
|
vm.createContext(sandbox);
|
|
102
|
+
// The header is drawn from profile-roles.js (task 1004434), loaded first as the page does.
|
|
103
|
+
vm.runInContext(ROLES_SRC, sandbox, { filename: 'profile-roles.js' });
|
|
101
104
|
vm.runInContext(SRC, sandbox, { filename: 'profile.js' });
|
|
102
105
|
// load() is fire-and-forget; let its await chain settle.
|
|
103
106
|
for (let i = 0; i < 4; i++) await new Promise((r) => setImmediate(r));
|