Resource Explorer consolidation (Phases 1–6, shipped)
The consolidation program that turned every editor + the surveyer into resources (/docs/architecture/resources) rendered by one Azure-portal-like explorer. Six phases, all shipped; documents rows were migrated in place (the table became resources), while surveys rows were discarded by design. This page keeps only the durable record — current-state detail lives in the feature pages and architecture standards.
What shipped, per phase
- Schema + factory + container —
documents→resources(+ResourceTypeenum), publish normalized intoresource_publications(row exists iff published),AzureContainer.ResourceAssetsreplacing six per-editor containers,ResourceDefinitionMap+ capability unions,createResourceProceduresfactory (conditional publish procedures,transformPublishedContent/transformPublicReadContenthooks), cross-typeresource.readResources. - Explorer shell —
/resourcesHome (search + quick-create + recents),/resources/alllist,/resources/create[/type]gallery + form,/resources/[id]/[[blade]]two-flex-box page,useResource(id),/view/[type]/[id]public dispatch. - Thin editors migrated (Flowchart → Email → Webpage + Dashboard) — routers onto the factory, editors became inline Editor blades (
ResourceEditorComponentMap,<ClientOnly><Suspense>inBladeOutlet), stores retargeted touseResource,PortableFormatreshaped to self-contained asyncexport()/import(),ViewComponentMaprenderers, per-editor pages/launcher entries deleted. - Sheet split + TodoList —
ResourceType.Tabledied;sheetResourceSchema({ settings, data }) + Data/Settings blades,todoListSchema+ Items/Calendar blades, command/undo stack re-seamed ontoDataSource, dataset provider re-keyedTableDocument→Sheet. - Survey fold —
surveystable/AzureContainer.SurveyAssetsdeleted; survey rides the factory with response/SAS procedures kept, publish clones assets under{id}/published/{v}/…, Editor (SurveyJS creator) + Responses blades, respondent renderer inViewComponentMap. - Deletions + sweep — router renames (
flowchartEditor→flowchart,emailEditor→email,webpageEditor→webpage), achievementtriggerPaths re-keyed, deadRoutePathmembers dropped, grep sweep green.
Durable gotchas
- Content class names are frozen.
FlowchartEditor/EmailEditor/WebpageEditorclasses (and theirstore//models//services/folder names) keep the legacy names — they are registered inJSONClassMap, so renaming breaks superjson deserialization of persisted blobs. - Publish snapshots live at
{id}/published/{n}.json, with their cloned assets beside them under a per-publish{id}/published/{publishId}/files/…; publish clones referenced asset blobs and rewrites their stable urls (transformPublishedBlobUrls→cloneContentAssets) — content embeds only stable/api/resource-assetsurls, so reads never rewrite anything (resource file assets). - Create writes no blob — the content blob first exists at the first
saveResourceContent; one blob, onecontentVersion, optimistic concurrency on save. - Publish status is deliberately not a
/alllist column — it is a capability surfaced on the Overview blade. - Migrations:
20260707004532_aberrant_emma_frost(documents → resources + publish split),20260710120004_talented_slayback(dropsurveys, dropTablefromresource_type). - Zero new dependencies and zero new Azure services were added across all six phases — one renamed table, one container replacing six, reshaped routers.
Previous
Resource Explorer
The single Azure-portal-like UI for every resource — Home, list, marketplace create flow, and a resource page composing capability-aware blades.
Next
Resource Page Parity
Azure command-bar parity on the resource page — labeled commands with overflow, Refresh, Duplicate, type-the-name delete guard, and a save-conflict surface.