Add a page that displays all components
Reviewers: #reviewers Subscribers: jenkins-user Differential Revision: https://hub.sealcode.org/D1451
This commit is contained in:
parent
8009be3341
commit
5a704c3d48
1079
package-lock.json
generated
1079
package-lock.json
generated
File diff suppressed because it is too large
Load Diff
@ -59,7 +59,7 @@
|
|||||||
"qs": "^6.12.0",
|
"qs": "^6.12.0",
|
||||||
"sealious": "^0.19.6",
|
"sealious": "^0.19.6",
|
||||||
"stimulus": "^2.0.0",
|
"stimulus": "^2.0.0",
|
||||||
"tempstream": "^0.3.15"
|
"tempstream": "^0.3.16"
|
||||||
},
|
},
|
||||||
"devDependencies": {
|
"devDependencies": {
|
||||||
"@sealcode/ansi-html-stream": "^1.0.1",
|
"@sealcode/ansi-html-stream": "^1.0.1",
|
||||||
|
@ -43,6 +43,7 @@ export class ImageDemo extends Component<typeof component_arguments> {
|
|||||||
height: 200,
|
height: 200,
|
||||||
objectFit: "cover",
|
objectFit: "cover",
|
||||||
},
|
},
|
||||||
|
alt: "demo",
|
||||||
})
|
})
|
||||||
)}
|
)}
|
||||||
</div>
|
</div>
|
||||||
@ -57,6 +58,7 @@ export class ImageDemo extends Component<typeof component_arguments> {
|
|||||||
objectFit: "cover",
|
objectFit: "cover",
|
||||||
},
|
},
|
||||||
crop: { width: 200, height: 200 },
|
crop: { width: 200, height: 200 },
|
||||||
|
alt: "demo",
|
||||||
})
|
})
|
||||||
)}
|
)}
|
||||||
</div>
|
</div>
|
||||||
|
2
src/back/jdd-components/registry.ts
Normal file
2
src/back/jdd-components/registry.ts
Normal file
@ -0,0 +1,2 @@
|
|||||||
|
// this is to help IDEs see the .gitignored files
|
||||||
|
export * from "./components.js";
|
36
src/back/routes/all-components.page.tsx
Normal file
36
src/back/routes/all-components.page.tsx
Normal file
@ -0,0 +1,36 @@
|
|||||||
|
import type { Context } from "koa";
|
||||||
|
import { TempstreamJSX } from "tempstream";
|
||||||
|
import { Page } from "@sealcode/sealgen";
|
||||||
|
import html from "../html.js";
|
||||||
|
import { registry } from "../jdd-components/components.js";
|
||||||
|
import { jdd_context } from "../jdd-context.js";
|
||||||
|
import { render } from "@sealcode/jdd";
|
||||||
|
import { shuffle } from "../util.js";
|
||||||
|
|
||||||
|
export const actionName = "AllComponents";
|
||||||
|
|
||||||
|
export default new (class AllComponentsPage extends Page {
|
||||||
|
// eslint-disable-next-line @typescript-eslint/no-unused-vars
|
||||||
|
async canAccess(_: Context) {
|
||||||
|
return { canAccess: true, message: "" };
|
||||||
|
}
|
||||||
|
|
||||||
|
async render(ctx: Context) {
|
||||||
|
const components = registry.getAll();
|
||||||
|
const document = await Promise.all(
|
||||||
|
shuffle(Object.entries(components)).map(
|
||||||
|
async ([component_name, component]) => {
|
||||||
|
return {
|
||||||
|
component_name,
|
||||||
|
args: await component.getExampleValues(jdd_context),
|
||||||
|
};
|
||||||
|
}
|
||||||
|
)
|
||||||
|
);
|
||||||
|
return html(
|
||||||
|
ctx,
|
||||||
|
"AllComponents",
|
||||||
|
<div>{render(registry, document, jdd_context)}</div>
|
||||||
|
);
|
||||||
|
}
|
||||||
|
})();
|
40
src/back/routes/all-components.test.ts
Normal file
40
src/back/routes/all-components.test.ts
Normal file
@ -0,0 +1,40 @@
|
|||||||
|
import { withProdApp } from "../test_utils/with-prod-app.js";
|
||||||
|
import { VERY_LONG_TEST_TIMEOUT, webhintURL } from "../test_utils/webhint.js";
|
||||||
|
import { AllComponentsURL } from "./urls.js";
|
||||||
|
import { getBrowser } from "../test_utils/browser-creator.js";
|
||||||
|
import type { Browser, BrowserContext, Page } from "@playwright/test";
|
||||||
|
|
||||||
|
describe("AllComponents webhint", () => {
|
||||||
|
it("doesn't crash", async function () {
|
||||||
|
return withProdApp(async ({ base_url, rest_api }) => {
|
||||||
|
await rest_api.get(AllComponentsURL);
|
||||||
|
await webhintURL(base_url + AllComponentsURL);
|
||||||
|
// alternatively you can use webhintHTML for faster but less precise scans
|
||||||
|
// or for scanning responses of requests that use some form of authorization:
|
||||||
|
// const response = await rest_api.get(AllComponentsURL);
|
||||||
|
// await webhintHTML(response);
|
||||||
|
});
|
||||||
|
}).timeout(VERY_LONG_TEST_TIMEOUT);
|
||||||
|
});
|
||||||
|
|
||||||
|
describe("AllComponents", () => {
|
||||||
|
let page: Page;
|
||||||
|
let browser: Browser;
|
||||||
|
let context: BrowserContext;
|
||||||
|
|
||||||
|
beforeEach(async () => {
|
||||||
|
browser = await getBrowser();
|
||||||
|
context = await browser.newContext();
|
||||||
|
page = await context.newPage();
|
||||||
|
});
|
||||||
|
|
||||||
|
afterEach(async () => {
|
||||||
|
await context.close();
|
||||||
|
});
|
||||||
|
|
||||||
|
it("works as expected", async function () {
|
||||||
|
return withProdApp(async ({ base_url }) => {
|
||||||
|
await page.goto(base_url + AllComponentsURL);
|
||||||
|
});
|
||||||
|
}).timeout(VERY_LONG_TEST_TIMEOUT);
|
||||||
|
});
|
@ -20,3 +20,22 @@ export function UrlWithNewParams(
|
|||||||
): string {
|
): string {
|
||||||
return `${ctx.path}?${qs.stringify(query_params)}`;
|
return `${ctx.path}?${qs.stringify(query_params)}`;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
export function shuffle<T>(array: T[]): T[] {
|
||||||
|
const array_copy = [...array];
|
||||||
|
let currentIndex = array_copy.length;
|
||||||
|
|
||||||
|
// While there remain elements to shuffle...
|
||||||
|
while (currentIndex != 0) {
|
||||||
|
// Pick a remaining element...
|
||||||
|
const randomIndex = Math.floor(Math.random() * currentIndex);
|
||||||
|
currentIndex--;
|
||||||
|
|
||||||
|
// And swap it with the current element.
|
||||||
|
[array_copy[currentIndex], array_copy[randomIndex]] = [
|
||||||
|
array_copy[randomIndex],
|
||||||
|
array_copy[currentIndex],
|
||||||
|
];
|
||||||
|
}
|
||||||
|
return array_copy;
|
||||||
|
}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user