@forumone/create-throughline 0.2.1 → 0.3.1
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/CHANGELOG.md +21 -0
- package/dist/generator.d.ts +2 -0
- package/dist/generator.d.ts.map +1 -1
- package/dist/generator.js +23 -4
- package/dist/generator.js.map +1 -1
- package/dist/post-install.js +1 -1
- package/dist/post-install.js.map +1 -1
- package/dist/templates/base/README.md +8 -9
- package/dist/templates/base/apps/web/package.json.template +11 -10
- package/dist/templates/base/apps/web/src/app/api/inngest/route.ts.template +33 -4
- package/dist/templates/base/apps/web/src/payload.config.ts.template +21 -6
- package/dist/templates/base/apps/web/tsconfig.json +2 -1
- package/dist/templates/base/gitignore +15 -0
- package/dist/templates/base/package.json.template +4 -1
- package/dist/templates/base/pnpm-workspace.yaml +1 -0
- package/dist/templates/base/turbo.json +11 -0
- package/dist/templates/with-reference-ds/design-system/.storybook/main.ts +21 -0
- package/dist/templates/with-reference-ds/design-system/.storybook/preview.ts +19 -0
- package/dist/templates/with-reference-ds/design-system/README.md +33 -0
- package/dist/templates/with-reference-ds/design-system/gitignore +5 -0
- package/dist/templates/with-reference-ds/design-system/package.json.template +62 -0
- package/dist/templates/with-reference-ds/design-system/scripts/build-manifest.ts +89 -0
- package/dist/templates/with-reference-ds/design-system/scripts/build-styles.ts +28 -0
- package/dist/templates/with-reference-ds/design-system/scripts/build-tokens-css.ts +43 -0
- package/dist/templates/with-reference-ds/design-system/scripts/validate.ts +58 -0
- package/dist/templates/with-reference-ds/design-system/src/components/CTASection/CTASection.contract.ts +128 -0
- package/dist/templates/with-reference-ds/design-system/src/components/CTASection/CTASection.module.css +83 -0
- package/dist/templates/with-reference-ds/design-system/src/components/CTASection/CTASection.stories.tsx +39 -0
- package/dist/templates/with-reference-ds/design-system/src/components/CTASection/CTASection.test.tsx +27 -0
- package/dist/templates/with-reference-ds/design-system/src/components/CTASection/CTASection.tsx +41 -0
- package/dist/templates/with-reference-ds/design-system/src/components/CTASection/index.ts +2 -0
- package/dist/templates/with-reference-ds/design-system/src/components/Card/Card.contract.ts +122 -0
- package/dist/templates/with-reference-ds/design-system/src/components/Card/Card.module.css +64 -0
- package/dist/templates/with-reference-ds/design-system/src/components/Card/Card.stories.tsx +45 -0
- package/dist/templates/with-reference-ds/design-system/src/components/Card/Card.test.tsx +37 -0
- package/dist/templates/with-reference-ds/design-system/src/components/Card/Card.tsx +39 -0
- package/dist/templates/with-reference-ds/design-system/src/components/Card/index.ts +2 -0
- package/dist/templates/with-reference-ds/design-system/src/components/CardGrid/CardGrid.contract.ts +78 -0
- package/dist/templates/with-reference-ds/design-system/src/components/CardGrid/CardGrid.module.css +34 -0
- package/dist/templates/with-reference-ds/design-system/src/components/CardGrid/CardGrid.stories.tsx +36 -0
- package/dist/templates/with-reference-ds/design-system/src/components/CardGrid/CardGrid.test.tsx +25 -0
- package/dist/templates/with-reference-ds/design-system/src/components/CardGrid/CardGrid.tsx +19 -0
- package/dist/templates/with-reference-ds/design-system/src/components/CardGrid/index.ts +2 -0
- package/dist/templates/with-reference-ds/design-system/src/components/Divider/Divider.contract.ts +87 -0
- package/dist/templates/with-reference-ds/design-system/src/components/Divider/Divider.module.css +18 -0
- package/dist/templates/with-reference-ds/design-system/src/components/Divider/Divider.stories.tsx +35 -0
- package/dist/templates/with-reference-ds/design-system/src/components/Divider/Divider.test.tsx +20 -0
- package/dist/templates/with-reference-ds/design-system/src/components/Divider/Divider.tsx +17 -0
- package/dist/templates/with-reference-ds/design-system/src/components/Divider/index.ts +2 -0
- package/dist/templates/with-reference-ds/design-system/src/components/FAQ/FAQ.contract.ts +104 -0
- package/dist/templates/with-reference-ds/design-system/src/components/FAQ/FAQ.module.css +66 -0
- package/dist/templates/with-reference-ds/design-system/src/components/FAQ/FAQ.stories.tsx +61 -0
- package/dist/templates/with-reference-ds/design-system/src/components/FAQ/FAQ.test.tsx +30 -0
- package/dist/templates/with-reference-ds/design-system/src/components/FAQ/FAQ.tsx +41 -0
- package/dist/templates/with-reference-ds/design-system/src/components/FAQ/index.ts +2 -0
- package/dist/templates/with-reference-ds/design-system/src/components/Hero/Hero.contract.ts +182 -0
- package/dist/templates/with-reference-ds/design-system/src/components/Hero/Hero.module.css +124 -0
- package/dist/templates/with-reference-ds/design-system/src/components/Hero/Hero.stories.tsx +58 -0
- package/dist/templates/with-reference-ds/design-system/src/components/Hero/Hero.test.tsx +49 -0
- package/dist/templates/with-reference-ds/design-system/src/components/Hero/Hero.tsx +67 -0
- package/dist/templates/with-reference-ds/design-system/src/components/Hero/index.ts +2 -0
- package/dist/templates/with-reference-ds/design-system/src/components/MediaBlock/MediaBlock.contract.ts +94 -0
- package/dist/templates/with-reference-ds/design-system/src/components/MediaBlock/MediaBlock.module.css +49 -0
- package/dist/templates/with-reference-ds/design-system/src/components/MediaBlock/MediaBlock.stories.tsx +37 -0
- package/dist/templates/with-reference-ds/design-system/src/components/MediaBlock/MediaBlock.test.tsx +35 -0
- package/dist/templates/with-reference-ds/design-system/src/components/MediaBlock/MediaBlock.tsx +49 -0
- package/dist/templates/with-reference-ds/design-system/src/components/MediaBlock/index.ts +7 -0
- package/dist/templates/with-reference-ds/design-system/src/components/Prose/Prose.contract.ts +107 -0
- package/dist/templates/with-reference-ds/design-system/src/components/Prose/Prose.module.css +72 -0
- package/dist/templates/with-reference-ds/design-system/src/components/Prose/Prose.stories.tsx +39 -0
- package/dist/templates/with-reference-ds/design-system/src/components/Prose/Prose.test.tsx +26 -0
- package/dist/templates/with-reference-ds/design-system/src/components/Prose/Prose.tsx +15 -0
- package/dist/templates/with-reference-ds/design-system/src/components/Prose/index.ts +2 -0
- package/dist/templates/with-reference-ds/design-system/src/components/Quote/Quote.contract.ts +101 -0
- package/dist/templates/with-reference-ds/design-system/src/components/Quote/Quote.module.css +59 -0
- package/dist/templates/with-reference-ds/design-system/src/components/Quote/Quote.stories.tsx +44 -0
- package/dist/templates/with-reference-ds/design-system/src/components/Quote/Quote.test.tsx +37 -0
- package/dist/templates/with-reference-ds/design-system/src/components/Quote/Quote.tsx +40 -0
- package/dist/templates/with-reference-ds/design-system/src/components/Quote/index.ts +2 -0
- package/dist/templates/with-reference-ds/design-system/src/components/SectionIntro/SectionIntro.contract.ts +108 -0
- package/dist/templates/with-reference-ds/design-system/src/components/SectionIntro/SectionIntro.module.css +36 -0
- package/dist/templates/with-reference-ds/design-system/src/components/SectionIntro/SectionIntro.stories.tsx +33 -0
- package/dist/templates/with-reference-ds/design-system/src/components/SectionIntro/SectionIntro.test.tsx +28 -0
- package/dist/templates/with-reference-ds/design-system/src/components/SectionIntro/SectionIntro.tsx +28 -0
- package/dist/templates/with-reference-ds/design-system/src/components/SectionIntro/index.ts +2 -0
- package/dist/templates/with-reference-ds/design-system/src/components/Spacer/Spacer.contract.ts +76 -0
- package/dist/templates/with-reference-ds/design-system/src/components/Spacer/Spacer.module.css +23 -0
- package/dist/templates/with-reference-ds/design-system/src/components/Spacer/Spacer.stories.tsx +25 -0
- package/dist/templates/with-reference-ds/design-system/src/components/Spacer/Spacer.test.tsx +17 -0
- package/dist/templates/with-reference-ds/design-system/src/components/Spacer/Spacer.tsx +19 -0
- package/dist/templates/with-reference-ds/design-system/src/components/Spacer/index.ts +2 -0
- package/dist/templates/with-reference-ds/design-system/src/components/Stats/Stats.contract.ts +103 -0
- package/dist/templates/with-reference-ds/design-system/src/components/Stats/Stats.module.css +88 -0
- package/dist/templates/with-reference-ds/design-system/src/components/Stats/Stats.stories.tsx +44 -0
- package/dist/templates/with-reference-ds/design-system/src/components/Stats/Stats.test.tsx +44 -0
- package/dist/templates/with-reference-ds/design-system/src/components/Stats/Stats.tsx +39 -0
- package/dist/templates/with-reference-ds/design-system/src/components/Stats/index.ts +2 -0
- package/dist/templates/with-reference-ds/design-system/src/css-modules.d.ts +5 -0
- package/dist/templates/with-reference-ds/design-system/src/foundations/Colors.stories.tsx +46 -0
- package/dist/templates/with-reference-ds/design-system/src/foundations/Elevation.stories.tsx +37 -0
- package/dist/templates/with-reference-ds/design-system/src/foundations/LayoutContainers.stories.tsx +86 -0
- package/dist/templates/with-reference-ds/design-system/src/foundations/Radii.stories.tsx +38 -0
- package/dist/templates/with-reference-ds/design-system/src/foundations/Spacing.stories.tsx +33 -0
- package/dist/templates/with-reference-ds/design-system/src/foundations/Typography.stories.tsx +55 -0
- package/dist/templates/with-reference-ds/design-system/src/foundations/_helpers.tsx +82 -0
- package/dist/templates/with-reference-ds/design-system/src/index.ts +14 -0
- package/dist/templates/with-reference-ds/design-system/src/styles/base.css +55 -0
- package/dist/templates/with-reference-ds/design-system/src/styles/reset.css +48 -0
- package/dist/templates/with-reference-ds/design-system/src/styles/tokens.css +116 -0
- package/dist/templates/with-reference-ds/design-system/src/tokens/colors.ts +54 -0
- package/dist/templates/with-reference-ds/design-system/src/tokens/index.ts +32 -0
- package/dist/templates/with-reference-ds/design-system/src/tokens/layout.ts +26 -0
- package/dist/templates/with-reference-ds/design-system/src/tokens/radii.ts +11 -0
- package/dist/templates/with-reference-ds/design-system/src/tokens/spacing.ts +26 -0
- package/dist/templates/with-reference-ds/design-system/src/tokens/typography.ts +32 -0
- package/dist/templates/with-reference-ds/design-system/tsconfig.json +24 -0
- package/dist/templates/with-reference-ds/design-system/vitest.config.ts +15 -0
- package/dist/templates/with-reference-ds/design-system/vitest.setup.ts +7 -0
- package/dist/templates/without-reference-ds/design-system/.storybook/main.ts +21 -0
- package/dist/templates/without-reference-ds/design-system/.storybook/preview.ts +16 -0
- package/dist/templates/without-reference-ds/design-system/README.md +20 -0
- package/dist/templates/without-reference-ds/design-system/gitignore +5 -0
- package/dist/templates/without-reference-ds/design-system/package.json.template +33 -0
- package/dist/templates/without-reference-ds/design-system/src/foundations/Welcome.stories.tsx +24 -0
- package/dist/templates/without-reference-ds/design-system/src/index.ts +9 -0
- package/dist/templates/without-reference-ds/design-system/tsconfig.json +11 -0
- package/dist/utils/versions.d.ts +20 -0
- package/dist/utils/versions.d.ts.map +1 -0
- package/dist/utils/versions.js +59 -0
- package/dist/utils/versions.js.map +1 -0
- package/dist/versions.json +14 -0
- package/package.json +7 -5
- package/dist/templates/with-reference-ds/packages/design-system/package.json.template +0 -18
- package/dist/templates/with-reference-ds/packages/design-system/src/index.ts +0 -6
- package/dist/templates/with-reference-ds/packages/design-system/src/manifest.ts +0 -6
- package/dist/templates/with-reference-ds/packages/design-system/tsconfig.json +0 -9
- package/dist/templates/without-reference-ds/packages/design-system/README.md +0 -19
- package/dist/templates/without-reference-ds/packages/design-system/package.json.template +0 -14
- package/dist/templates/without-reference-ds/packages/design-system/src/index.ts +0 -8
package/CHANGELOG.md
CHANGED
|
@@ -1,5 +1,26 @@
|
|
|
1
1
|
# @forumone/create-throughline
|
|
2
2
|
|
|
3
|
+
## 0.3.1
|
|
4
|
+
|
|
5
|
+
### Patch Changes
|
|
6
|
+
|
|
7
|
+
- eec328e: A scaffolded site depends on the current release of every Throughline package. The ranges were typed into the templates as `^0.2.0`, which admits patches only for a 0.x version, so a new site installed the earliest releases. They are now read from the workspace when the scaffolder is built, and baked into `dist/versions.json`.
|
|
8
|
+
- 70223ef: The scaffolded `payload.config.ts` signs approval links with `generateActionToken` and points them at `/api/approvals/action`, the route `approvalsPlugin` serves. It used to build an unsigned query string against `/api/approvals/decision`, which nothing serves, so every button in an approval email 404'd.
|
|
9
|
+
|
|
10
|
+
## 0.3.0
|
|
11
|
+
|
|
12
|
+
### Minor Changes
|
|
13
|
+
|
|
14
|
+
- e994176: Scaffold a real Storybook authoring environment for the design system.
|
|
15
|
+
|
|
16
|
+
When you scaffold with the reference design system, the generator now creates a top-level `design-system/` workspace (a sibling of `apps/`, matching the Forum One `forumone.com-2026` layout) that vendors the reference DS's **editable source** — 12 components with `.stories.tsx`, `.contract.ts`, tokens, and a Storybook instance — instead of re-exporting the compiled npm package. New projects can run `pnpm storybook` immediately, author components, and `pnpm validate` to cross-check every contract `storyId` against the built Storybook.
|
|
17
|
+
|
|
18
|
+
Also:
|
|
19
|
+
- The web app now imports the workspace design system's built manifest (`<scope>/design-system/manifest`) instead of the npm reference-ds manifest, and the root `pnpm dev` builds the design system first so the manifest exists.
|
|
20
|
+
- Root scripts `storybook`, `build-storybook`, and `validate`; turbo tasks to match; `design-system` added to the workspace globs.
|
|
21
|
+
- Fix: template `.gitignore` files are now authored as `gitignore` and restored on output, so they survive npm publish (previously the generated project shipped without a root `.gitignore`).
|
|
22
|
+
- Fix: the generated web app now typechecks clean. Adds the `@payload-config` tsconfig path; corrects drifted plugin APIs in `route.ts` (`publishingApiKey`, `createPayloadReachableCheck()`) and `payload.config.ts` (`auditQueryPlugin({})`, `buildActionUrl` async `{ approvalId, action, approverId }`, manifest typed as `Manifest`).
|
|
23
|
+
|
|
3
24
|
## 0.2.1
|
|
4
25
|
|
|
5
26
|
### Patch Changes
|
package/dist/generator.d.ts
CHANGED
|
@@ -37,9 +37,11 @@ interface RenderArgs {
|
|
|
37
37
|
*/
|
|
38
38
|
declare function renderDirectory({ source, target, data }: RenderArgs): Promise<void>;
|
|
39
39
|
declare function isBinary(filename: string): boolean;
|
|
40
|
+
declare function applyDotfileRename(name: string): string;
|
|
40
41
|
export declare const __testing: {
|
|
41
42
|
renderDirectory: typeof renderDirectory;
|
|
42
43
|
isBinary: typeof isBinary;
|
|
44
|
+
applyDotfileRename: typeof applyDotfileRename;
|
|
43
45
|
rename: typeof rename;
|
|
44
46
|
rm: typeof rm;
|
|
45
47
|
stat: typeof stat;
|
package/dist/generator.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"generator.d.ts","sourceRoot":"","sources":["../src/generator.ts"],"names":[],"mappings":"AACA,OAAO,EAAgC,MAAM,EAAE,EAAE,EAAE,IAAI,EAAa,MAAM,kBAAkB,CAAA;
|
|
1
|
+
{"version":3,"file":"generator.d.ts","sourceRoot":"","sources":["../src/generator.ts"],"names":[],"mappings":"AACA,OAAO,EAAgC,MAAM,EAAE,EAAE,EAAE,IAAI,EAAa,MAAM,kBAAkB,CAAA;AAK5F,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,cAAc,CAAA;AAK3C,MAAM,WAAW,eAAe;IAC9B,wDAAwD;IACxD,YAAY,CAAC,EAAE,MAAM,CAAA;IACrB,qEAAqE;IACrE,eAAe,CAAC,EAAE,OAAO,CAAA;IACzB,+CAA+C;IAC/C,UAAU,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,CAAA;CACpC;AAED;;;;;;;;;;GAUG;AACH,wBAAsB,QAAQ,CAAC,OAAO,EAAE,OAAO,EAAE,OAAO,GAAE,eAAoB,GAAG,OAAO,CAAC,IAAI,CAAC,CAsC7F;AAED,UAAU,UAAU;IAClB,MAAM,EAAE,MAAM,CAAA;IACd,MAAM,EAAE,MAAM,CAAA;IACd,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;CAC9B;AAED;;;;;;;;;GASG;AACH,iBAAe,eAAe,CAAC,EAAE,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,EAAE,UAAU,GAAG,OAAO,CAAC,IAAI,CAAC,CAmClF;AAiBD,iBAAS,QAAQ,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAI3C;AAUD,iBAAS,kBAAkB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAEhD;AA6BD,eAAO,MAAM,SAAS;;;;;;;CAAsE,CAAA"}
|
package/dist/generator.js
CHANGED
|
@@ -3,6 +3,7 @@ import { cp, mkdir, readFile, readdir, rename, rm, stat, writeFile } from 'node:
|
|
|
3
3
|
import { dirname, join, resolve } from 'node:path';
|
|
4
4
|
import { fileURLToPath } from 'node:url';
|
|
5
5
|
import { renderTemplate } from './utils/templates.js';
|
|
6
|
+
import { loadPackageVersions } from './utils/versions.js';
|
|
6
7
|
const __dirname = dirname(fileURLToPath(import.meta.url));
|
|
7
8
|
const DEFAULT_TEMPLATES_DIR = resolve(__dirname, 'templates');
|
|
8
9
|
/**
|
|
@@ -19,19 +20,27 @@ const DEFAULT_TEMPLATES_DIR = resolve(__dirname, 'templates');
|
|
|
19
20
|
export async function generate(answers, options = {}) {
|
|
20
21
|
const templatesDir = options.templatesDir ?? DEFAULT_TEMPLATES_DIR;
|
|
21
22
|
const onProgress = options.onProgress ?? (() => { });
|
|
23
|
+
// Precompute the design-system package name. The renderer has no nesting, so
|
|
24
|
+
// we can't put `{{#if packageScope}}...{{/if}}` inside another `{{#if}}`
|
|
25
|
+
// block (e.g. inside `{{#if useReferenceDs}}` in payload.config).
|
|
26
|
+
const designSystemName = answers.packageScope
|
|
27
|
+
? `@${answers.packageScope}/design-system`
|
|
28
|
+
: `${answers.projectName}-design-system`;
|
|
29
|
+
const versions = await loadPackageVersions(templatesDir);
|
|
30
|
+
const data = { ...answers, designSystemName, ...versions };
|
|
22
31
|
onProgress('Creating project structure');
|
|
23
32
|
await mkdir(answers.targetDir, { recursive: true });
|
|
24
33
|
await renderDirectory({
|
|
25
34
|
source: join(templatesDir, 'base'),
|
|
26
35
|
target: answers.targetDir,
|
|
27
|
-
data
|
|
36
|
+
data,
|
|
28
37
|
});
|
|
29
38
|
onProgress(answers.useReferenceDs ? 'Wiring reference design system' : 'Preparing design system placeholder');
|
|
30
39
|
const overlay = answers.useReferenceDs ? 'with-reference-ds' : 'without-reference-ds';
|
|
31
40
|
await renderDirectory({
|
|
32
41
|
source: join(templatesDir, overlay),
|
|
33
42
|
target: answers.targetDir,
|
|
34
|
-
data
|
|
43
|
+
data,
|
|
35
44
|
});
|
|
36
45
|
if (answers.initializeGit && !options.skipSideEffects) {
|
|
37
46
|
onProgress('Initializing git');
|
|
@@ -64,7 +73,7 @@ async function renderDirectory({ source, target, data }) {
|
|
|
64
73
|
}
|
|
65
74
|
await mkdir(target, { recursive: true });
|
|
66
75
|
for (const entry of entries) {
|
|
67
|
-
const renderedName = renderTemplate(entry.name, data);
|
|
76
|
+
const renderedName = applyDotfileRename(renderTemplate(entry.name, data));
|
|
68
77
|
const sourcePath = join(source, entry.name);
|
|
69
78
|
const targetPath = join(target, renderedName);
|
|
70
79
|
if (entry.isDirectory()) {
|
|
@@ -105,6 +114,16 @@ function isBinary(filename) {
|
|
|
105
114
|
return false;
|
|
106
115
|
return BINARY_EXTENSIONS.has(filename.slice(dot).toLowerCase());
|
|
107
116
|
}
|
|
117
|
+
/**
|
|
118
|
+
* npm strips files literally named `.gitignore` from a published tarball, so
|
|
119
|
+
* we author them as `gitignore` in templates and restore the dot on output.
|
|
120
|
+
*/
|
|
121
|
+
const DOTFILE_RENAMES = {
|
|
122
|
+
gitignore: '.gitignore',
|
|
123
|
+
};
|
|
124
|
+
function applyDotfileRename(name) {
|
|
125
|
+
return DOTFILE_RENAMES[name] ?? name;
|
|
126
|
+
}
|
|
108
127
|
async function initGit(dir) {
|
|
109
128
|
await runCommand('git', ['init'], dir);
|
|
110
129
|
await runCommand('git', ['add', '.'], dir);
|
|
@@ -127,5 +146,5 @@ function runCommand(cmd, args, cwd) {
|
|
|
127
146
|
}
|
|
128
147
|
// Re-exports kept around so tests in adjacent packages can stub these without
|
|
129
148
|
// reaching into the implementation. Not part of the public API surface.
|
|
130
|
-
export const __testing = { renderDirectory, isBinary, rename, rm, stat };
|
|
149
|
+
export const __testing = { renderDirectory, isBinary, applyDotfileRename, rename, rm, stat };
|
|
131
150
|
//# sourceMappingURL=generator.js.map
|
package/dist/generator.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"generator.js","sourceRoot":"","sources":["../src/generator.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,MAAM,oBAAoB,CAAA;AAC1C,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,QAAQ,EAAE,OAAO,EAAE,MAAM,EAAE,EAAE,EAAE,IAAI,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAA;AAC5F,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,WAAW,CAAA;AAClD,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAA;AACxC,OAAO,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAA;
|
|
1
|
+
{"version":3,"file":"generator.js","sourceRoot":"","sources":["../src/generator.ts"],"names":[],"mappings":"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"}
|
package/dist/post-install.js
CHANGED
|
@@ -32,7 +32,7 @@ export function printNextSteps(answers) {
|
|
|
32
32
|
lines.push(formatStep(step++, 'Open http://localhost:3000/admin and create your first admin user'));
|
|
33
33
|
lines.push(formatStep(step++, 'In the admin, go to API Keys and create one key per MCP server'));
|
|
34
34
|
lines.push(formatStep(step++, 'Paste those keys into .env.local'));
|
|
35
|
-
lines.push(formatStep(step
|
|
35
|
+
lines.push(formatStep(step, 'Wire Claude (or your MCP client) to your MCP endpoints — see the generated README.md'));
|
|
36
36
|
// eslint-disable-next-line no-console
|
|
37
37
|
console.log();
|
|
38
38
|
// eslint-disable-next-line no-console
|
package/dist/post-install.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"post-install.js","sourceRoot":"","sources":["../src/post-install.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,WAAW,CAAA;AACpC,OAAO,EAAE,MAAM,YAAY,CAAA;AAG3B;;;;;GAKG;AACH,MAAM,UAAU,cAAc,CAAC,OAAgB;IAC7C,MAAM,KAAK,GAAa,EAAE,CAAA;IAC1B,IAAI,IAAI,GAAG,CAAC,CAAA;IAEZ,MAAM,OAAO,GAAG,QAAQ,CAAC,OAAO,CAAC,SAAS,CAAC,CAAA;IAC3C,KAAK,CAAC,IAAI,CAAC,UAAU,CAAC,IAAI,EAAE,EAAE,GAAG,EAAE,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,OAAO,EAAE,CAAC,CAAC,CAAA;IAE7D,IAAI,CAAC,OAAO,CAAC,WAAW,EAAE,CAAC;QACzB,KAAK,CAAC,IAAI,CAAC,UAAU,CAAC,IAAI,EAAE,EAAE,EAAE,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC,CAAC,CAAA;IACzD,CAAC;IAED,KAAK,CAAC,IAAI,CACR,UAAU,CACR,IAAI,EAAE,EACN,QAAQ,EAAE,CAAC,IAAI,CAAC,cAAc,CAAC,OAAO,EAAE,CAAC,IAAI,CAAC,YAAY,CAAC,qBAAqB,CACjF,CACF,CAAA;IAED,IAAI,OAAO,CAAC,gBAAgB,KAAK,MAAM,EAAE,CAAC;QACxC,KAAK,CAAC,IAAI,CAAC,UAAU,EAAE,CAAC,GAAG,CAAC,qEAAqE,CAAC,EAAE,CAAC,CAAA;IACvG,CAAC;SAAM,IAAI,OAAO,CAAC,gBAAgB,KAAK,UAAU,EAAE,CAAC;QACnD,KAAK,CAAC,IAAI,CAAC,UAAU,EAAE,CAAC,GAAG,CAAC,gFAAgF,CAAC,EAAE,CAAC,CAAA;IAClH,CAAC;SAAM,CAAC;QACN,KAAK,CAAC,IAAI,CAAC,UAAU,EAAE,CAAC,GAAG,CAAC,+EAA+E,CAAC,EAAE,CAAC,CAAA;IACjH,CAAC;IAED,KAAK,CAAC,IAAI,CAAC,UAAU,CAAC,IAAI,EAAE,EAAE,4BAA4B,CAAC,CAAC,CAAA;IAC5D,KAAK,CAAC,IAAI,CAAC,UAAU,EAAE,CAAC,GAAG,CAAC,2CAA2C,CAAC,EAAE,CAAC,CAAA;IAC3E,KAAK,CAAC,IAAI,CAAC,UAAU,EAAE,CAAC,GAAG,CAAC,kDAAkD,CAAC,EAAE,CAAC,CAAA;IAClF,KAAK,CAAC,IAAI,CAAC,UAAU,EAAE,CAAC,GAAG,CAAC,iDAAiD,CAAC,EAAE,CAAC,CAAA;IAEjF,KAAK,CAAC,IAAI,CAAC,UAAU,CAAC,IAAI,EAAE,EAAE,GAAG,EAAE,CAAC,IAAI,CAAC,UAAU,CAAC,iBAAiB,CAAC,CAAC,CAAA;IACvE,KAAK,CAAC,IAAI,CACR,UAAU,CACR,IAAI,EAAE,EACN,mEAAmE,CACpE,CACF,CAAA;IACD,KAAK,CAAC,IAAI,CACR,UAAU,CACR,IAAI,EAAE,EACN,gEAAgE,CACjE,CACF,CAAA;IACD,KAAK,CAAC,IAAI,CAAC,UAAU,CAAC,IAAI,EAAE,EAAE,kCAAkC,CAAC,CAAC,CAAA;IAClE,KAAK,CAAC,IAAI,CACR,UAAU,CACR,IAAI,
|
|
1
|
+
{"version":3,"file":"post-install.js","sourceRoot":"","sources":["../src/post-install.ts"],"names":[],"mappings":"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"}
|
|
@@ -40,20 +40,19 @@ pnpm dev
|
|
|
40
40
|
|
|
41
41
|
## After admin signup
|
|
42
42
|
|
|
43
|
-
1. In the Payload admin, open
|
|
43
|
+
1. In the Payload admin, open **MCP → Payload MCP API Keys** and create one key. Pick a **User** — required; the key inherits that user's access control — tick **Enable API Key**, save, and copy the key. It is shown once, and it does not go in `.env.local`.
|
|
44
44
|
|
|
45
|
-
2. **Plug
|
|
45
|
+
2. **Plug it into Claude (or your MCP client).** One endpoint carries every server's tools:
|
|
46
46
|
|
|
47
47
|
```
|
|
48
|
-
/api/
|
|
49
|
-
|
|
50
|
-
/api/approvals/mcp
|
|
51
|
-
/api/audit/mcp
|
|
52
|
-
/api/forms/mcp
|
|
53
|
-
/api/integrations/mcp
|
|
48
|
+
POST /api/mcp
|
|
49
|
+
Authorization: Bearer <your key>
|
|
54
50
|
```
|
|
55
51
|
|
|
56
|
-
|
|
52
|
+
```bash
|
|
53
|
+
claude mcp add throughline http://localhost:3000/api/mcp \
|
|
54
|
+
--header "Authorization: Bearer $THROUGHLINE_API_KEY"
|
|
55
|
+
```
|
|
57
56
|
|
|
58
57
|
3. **Replace the example `pages` collection** in `apps/web/src/payload.config.ts` with your real content model. Keep the `policy` group on collections that should require approval — that field shape is what the approvals plugin reads.
|
|
59
58
|
|
|
@@ -12,16 +12,17 @@
|
|
|
12
12
|
"payload": "payload"
|
|
13
13
|
},
|
|
14
14
|
"dependencies": {
|
|
15
|
-
"@forumone/throughline-approvals": "^
|
|
16
|
-
"@forumone/throughline-audit": "^
|
|
17
|
-
"@forumone/throughline-components": "^
|
|
18
|
-
"@forumone/throughline-core": "^
|
|
19
|
-
"@forumone/throughline-email": "^
|
|
20
|
-
"@forumone/throughline-forms": "^
|
|
21
|
-
"@forumone/throughline-integrations": "^
|
|
22
|
-
"@forumone/throughline-publishing": "^
|
|
23
|
-
"@forumone/throughline-workflows": "^
|
|
24
|
-
{{#if useReferenceDs}}"@forumone/throughline-
|
|
15
|
+
"@forumone/throughline-approvals": "^{{version_approvals}}",
|
|
16
|
+
"@forumone/throughline-audit": "^{{version_audit}}",
|
|
17
|
+
"@forumone/throughline-components": "^{{version_components}}",
|
|
18
|
+
"@forumone/throughline-core": "^{{version_core}}",
|
|
19
|
+
"@forumone/throughline-email": "^{{version_email}}",
|
|
20
|
+
"@forumone/throughline-forms": "^{{version_forms}}",
|
|
21
|
+
"@forumone/throughline-integrations": "^{{version_integrations}}",
|
|
22
|
+
"@forumone/throughline-publishing": "^{{version_publishing}}",
|
|
23
|
+
"@forumone/throughline-workflows": "^{{version_workflows}}",
|
|
24
|
+
{{#if useReferenceDs}}"@forumone/throughline-design-contract": "^{{version_design_contract}}",
|
|
25
|
+
"{{designSystemName}}": "workspace:*",
|
|
25
26
|
{{/if}}"@payloadcms/db-postgres": "^3.83.0",
|
|
26
27
|
"@payloadcms/next": "^3.83.0",
|
|
27
28
|
"@payloadcms/plugin-form-builder": "3.83.0",
|
|
@@ -8,8 +8,11 @@ import {
|
|
|
8
8
|
createExpireStaleApprovalsFunction,
|
|
9
9
|
createHealthcheckFunction,
|
|
10
10
|
createPayloadReachableCheck,
|
|
11
|
+
createPublishAtScheduledTimeFunction,
|
|
11
12
|
createRevalidateOnPublishFunction,
|
|
13
|
+
type ScheduledPublishRequest,
|
|
12
14
|
} from '@forumone/throughline-workflows'
|
|
15
|
+
import { getPublishingService } from '@forumone/throughline-publishing'
|
|
13
16
|
import { getEmailFunctions } from '@forumone/throughline-email'
|
|
14
17
|
import { getFormsFunctions } from '@forumone/throughline-forms'
|
|
15
18
|
import {
|
|
@@ -22,6 +25,23 @@ const payload = await getPayload({ config })
|
|
|
22
25
|
|
|
23
26
|
const emailFunctions = getEmailFunctions(payload) ?? []
|
|
24
27
|
const formsFunctions = getFormsFunctions(payload) ?? []
|
|
28
|
+
/*
|
|
29
|
+
Through the publishing service, in process — so a scheduled publish passes the
|
|
30
|
+
same composition, accessibility and approval gates as an interactive one. Not
|
|
31
|
+
`payload.update`, which skips all of them.
|
|
32
|
+
*/
|
|
33
|
+
async function publishScheduled({ collection, id, reasoning }: ScheduledPublishRequest) {
|
|
34
|
+
const outcome = await getPublishingService(payload).publish({
|
|
35
|
+
collection,
|
|
36
|
+
id,
|
|
37
|
+
actor: { apiKeyName: 'scheduled-publish', channel: 'mcp' },
|
|
38
|
+
meta: { reasoning },
|
|
39
|
+
})
|
|
40
|
+
return { published: outcome.published, reason: outcome.reason }
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
const scheduledCollections = [{ slug: 'pages' }]
|
|
44
|
+
|
|
25
45
|
const integrationRegistry = getIntegrationRegistry(payload)
|
|
26
46
|
const integrationContext = getIntegrationContext(payload)
|
|
27
47
|
const integrationFunctions =
|
|
@@ -35,19 +55,28 @@ export const { GET, POST, PUT } = serve({
|
|
|
35
55
|
client: inngest,
|
|
36
56
|
functions: [
|
|
37
57
|
createRevalidateOnPublishFunction({ inngest, payload }),
|
|
58
|
+
// On time: sleeps until each document's scheduled time.
|
|
59
|
+
createPublishAtScheduledTimeFunction({
|
|
60
|
+
inngest,
|
|
61
|
+
payload,
|
|
62
|
+
collections: scheduledCollections,
|
|
63
|
+
publish: publishScheduled,
|
|
64
|
+
}),
|
|
65
|
+
// The backstop, for a schedule whose wake-up event never arrived.
|
|
38
66
|
createExecuteScheduledPublishesFunction({
|
|
39
67
|
inngest,
|
|
40
68
|
payload,
|
|
41
|
-
collections:
|
|
42
|
-
|
|
43
|
-
|
|
69
|
+
collections: scheduledCollections,
|
|
70
|
+
publish: publishScheduled,
|
|
71
|
+
schedule: '17 3 * * *',
|
|
72
|
+
overdueByMs: 60 * 60 * 1000,
|
|
44
73
|
}),
|
|
45
74
|
createExpireStaleApprovalsFunction({ inngest, payload }),
|
|
46
75
|
createAuditEventEchoFunction({ inngest }),
|
|
47
76
|
createHealthcheckFunction({
|
|
48
77
|
inngest,
|
|
49
78
|
payload,
|
|
50
|
-
checks: [createPayloadReachableCheck(
|
|
79
|
+
checks: [createPayloadReachableCheck()],
|
|
51
80
|
}),
|
|
52
81
|
...emailFunctions,
|
|
53
82
|
...formsFunctions,
|
|
@@ -11,12 +11,17 @@ import {
|
|
|
11
11
|
} from '@forumone/throughline-core'
|
|
12
12
|
import { componentsPlugin } from '@forumone/throughline-components'
|
|
13
13
|
import { publishingPlugin } from '@forumone/throughline-publishing'
|
|
14
|
-
import {
|
|
14
|
+
import {
|
|
15
|
+
approvalsPlugin,
|
|
16
|
+
buildActionUrl,
|
|
17
|
+
generateActionToken,
|
|
18
|
+
} from '@forumone/throughline-approvals'
|
|
15
19
|
import { auditQueryPlugin } from '@forumone/throughline-audit'
|
|
16
20
|
import { integrationsPlugin } from '@forumone/throughline-integrations'
|
|
17
21
|
import { emailPlugin } from '@forumone/throughline-email'
|
|
18
22
|
import { formsPlugin } from '@forumone/throughline-forms'
|
|
19
|
-
{{#if useReferenceDs}}import
|
|
23
|
+
{{#if useReferenceDs}}import type { Manifest } from '@forumone/throughline-design-contract'
|
|
24
|
+
import designSystemManifest from '{{designSystemName}}/manifest' with { type: 'json' }
|
|
20
25
|
{{/if}}
|
|
21
26
|
|
|
22
27
|
const __filename = fileURLToPath(import.meta.url)
|
|
@@ -101,7 +106,7 @@ export default buildConfig({
|
|
|
101
106
|
auditPlugin({ inngest }),
|
|
102
107
|
|
|
103
108
|
componentsPlugin({
|
|
104
|
-
{{#if useReferenceDs}}manifest: { type: 'object', manifest:
|
|
109
|
+
{{#if useReferenceDs}}manifest: { type: 'object', manifest: designSystemManifest as unknown as Manifest },
|
|
105
110
|
{{else}}// TODO: point at your design system manifest
|
|
106
111
|
manifest: { type: 'url', url: 'https://your-design-system.example.com/manifest.json' },
|
|
107
112
|
{{/if}}matching: { strategy: 'tfidf' },
|
|
@@ -132,15 +137,25 @@ export default buildConfig({
|
|
|
132
137
|
},
|
|
133
138
|
}),
|
|
134
139
|
|
|
135
|
-
auditQueryPlugin(),
|
|
140
|
+
auditQueryPlugin({}),
|
|
136
141
|
|
|
137
142
|
emailPlugin({
|
|
138
143
|
inngest,
|
|
139
144
|
// TODO: replace with your real user lookups
|
|
140
145
|
resolveApprover: async (_userId) => null,
|
|
141
146
|
resolveRequester: async (_userId) => null,
|
|
142
|
-
|
|
143
|
-
|
|
147
|
+
// Signed, and pointed at the route approvalsPlugin serves
|
|
148
|
+
// (`/api/approvals/action`). The token binds one approval, one action
|
|
149
|
+
// and one approver, so a link cannot be edited into a different decision.
|
|
150
|
+
buildActionUrl: async ({ approvalId, action, approverId }) => {
|
|
151
|
+
const secret = process.env.APPROVAL_TOKEN_SECRET
|
|
152
|
+
if (!secret) throw new Error('APPROVAL_TOKEN_SECRET is required to sign approval links.')
|
|
153
|
+
const token = await generateActionToken(
|
|
154
|
+
{ approvalId, action, approverId, issuedAt: Date.now() },
|
|
155
|
+
secret,
|
|
156
|
+
)
|
|
157
|
+
return buildActionUrl(process.env.NEXT_PUBLIC_SERVER_URL!, token)
|
|
158
|
+
},
|
|
144
159
|
tokens: { brandName: '{{projectName}}' },
|
|
145
160
|
}),
|
|
146
161
|
|
|
@@ -4,7 +4,10 @@
|
|
|
4
4
|
"type": "module",
|
|
5
5
|
"scripts": {
|
|
6
6
|
"build": "turbo run build",
|
|
7
|
-
"dev": "turbo run dev",
|
|
7
|
+
"dev": "{{#if useReferenceDs}}pnpm --filter \"./design-system\" build && {{/if}}turbo run dev",
|
|
8
|
+
"storybook": "turbo run storybook",
|
|
9
|
+
"build-storybook": "turbo run build-storybook",
|
|
10
|
+
"validate": "turbo run validate",
|
|
8
11
|
"lint": "turbo run lint",
|
|
9
12
|
"typecheck": "turbo run typecheck",
|
|
10
13
|
"test": "turbo run test",
|
|
@@ -7,6 +7,17 @@
|
|
|
7
7
|
"outputs": ["dist/**", ".next/**", "!.next/cache/**"],
|
|
8
8
|
"env": ["NODE_ENV"]
|
|
9
9
|
},
|
|
10
|
+
"build-storybook": {
|
|
11
|
+
"dependsOn": ["^build"],
|
|
12
|
+
"outputs": ["storybook-static/**"]
|
|
13
|
+
},
|
|
14
|
+
"storybook": {
|
|
15
|
+
"cache": false,
|
|
16
|
+
"persistent": true
|
|
17
|
+
},
|
|
18
|
+
"validate": {
|
|
19
|
+
"dependsOn": ["build"]
|
|
20
|
+
},
|
|
10
21
|
"dev": {
|
|
11
22
|
"cache": false,
|
|
12
23
|
"persistent": true
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
import type { StorybookConfig } from '@storybook/react-vite'
|
|
2
|
+
|
|
3
|
+
const config: StorybookConfig = {
|
|
4
|
+
stories: [
|
|
5
|
+
'../src/foundations/**/*.stories.@(ts|tsx)',
|
|
6
|
+
'../src/components/**/*.stories.@(ts|tsx)',
|
|
7
|
+
],
|
|
8
|
+
addons: ['@storybook/addon-a11y'],
|
|
9
|
+
framework: {
|
|
10
|
+
name: '@storybook/react-vite',
|
|
11
|
+
options: {},
|
|
12
|
+
},
|
|
13
|
+
typescript: {
|
|
14
|
+
reactDocgen: 'react-docgen-typescript',
|
|
15
|
+
},
|
|
16
|
+
docs: {
|
|
17
|
+
autodocs: true,
|
|
18
|
+
},
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
export default config
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
import type { Preview } from '@storybook/react-vite'
|
|
2
|
+
import '../src/styles/reset.css'
|
|
3
|
+
import '../src/styles/tokens.css'
|
|
4
|
+
import '../src/styles/base.css'
|
|
5
|
+
|
|
6
|
+
const preview: Preview = {
|
|
7
|
+
parameters: {
|
|
8
|
+
controls: {
|
|
9
|
+
matchers: { color: /(background|color)$/i, date: /Date$/i },
|
|
10
|
+
},
|
|
11
|
+
a11y: {
|
|
12
|
+
config: {},
|
|
13
|
+
options: {},
|
|
14
|
+
manual: false,
|
|
15
|
+
},
|
|
16
|
+
},
|
|
17
|
+
}
|
|
18
|
+
|
|
19
|
+
export default preview
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
# Design system
|
|
2
|
+
|
|
3
|
+
Your project's design system and its Storybook authoring environment. It started as a vendored copy of the Throughline reference DS — a working, brand-neutral set of 12 components with contracts — so you can edit it directly and make it your own.
|
|
4
|
+
|
|
5
|
+
```
|
|
6
|
+
src/
|
|
7
|
+
tokens/ Design tokens (colors, typography, spacing, radii, layout) → CSS custom properties
|
|
8
|
+
styles/ reset.css, generated tokens.css, base.css
|
|
9
|
+
foundations/ Storybook "Foundations" pages (Colors, Typography, Spacing, Radii, Elevation, Layout & Containers)
|
|
10
|
+
components/ One folder per component: .tsx, .module.css, .stories.tsx, .test.tsx, .contract.ts
|
|
11
|
+
scripts/ build-tokens-css, build-styles, build-manifest, validate
|
|
12
|
+
.storybook/ Storybook (react-vite) config
|
|
13
|
+
```
|
|
14
|
+
|
|
15
|
+
## Commands
|
|
16
|
+
|
|
17
|
+
```bash
|
|
18
|
+
pnpm --filter "./design-system" storybook # author components at http://localhost:6006
|
|
19
|
+
pnpm --filter "./design-system" build # tokens → tsc → styles → dist/manifest.json
|
|
20
|
+
pnpm --filter "./design-system" build-storybook # static Storybook (produces storybook-static/index.json)
|
|
21
|
+
pnpm --filter "./design-system" validate # lint contracts + cross-check every storyId against the built Storybook
|
|
22
|
+
pnpm --filter "./design-system" test # component tests (vitest + testing-library)
|
|
23
|
+
```
|
|
24
|
+
|
|
25
|
+
The web app imports `./manifest` (the built `dist/manifest.json`) and feeds it to the Components MCP server. The root `pnpm dev` builds the design system first so the manifest exists.
|
|
26
|
+
|
|
27
|
+
## Branding
|
|
28
|
+
|
|
29
|
+
1. Edit `src/tokens/*` — components read tokens as CSS variables, so re-theming doesn't touch component code.
|
|
30
|
+
2. Edit or add components under `src/components/`. Keep each component's `.contract.ts` and `.stories.tsx` in sync; `storyId` must point at a real story (the `validate` script enforces this).
|
|
31
|
+
3. Update the **Foundations** pages in `src/foundations/` as your tokens change.
|
|
32
|
+
|
|
33
|
+
See the Throughline docs: `concepts/design-system-contracts.md` and `guides/authoring-component-contracts.md`.
|
|
@@ -0,0 +1,62 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "{{designSystemName}}",
|
|
3
|
+
"version": "0.0.0",
|
|
4
|
+
"private": true,
|
|
5
|
+
"type": "module",
|
|
6
|
+
"main": "./dist/index.js",
|
|
7
|
+
"types": "./dist/index.d.ts",
|
|
8
|
+
"exports": {
|
|
9
|
+
".": {
|
|
10
|
+
"types": "./dist/index.d.ts",
|
|
11
|
+
"default": "./dist/index.js"
|
|
12
|
+
},
|
|
13
|
+
"./manifest": "./dist/manifest.json",
|
|
14
|
+
"./styles.css": "./dist/styles/index.css",
|
|
15
|
+
"./styles/tokens.css": "./dist/styles/tokens.css",
|
|
16
|
+
"./styles/reset.css": "./dist/styles/reset.css",
|
|
17
|
+
"./styles/base.css": "./dist/styles/base.css",
|
|
18
|
+
"./tokens": {
|
|
19
|
+
"types": "./dist/tokens/index.d.ts",
|
|
20
|
+
"default": "./dist/tokens/index.js"
|
|
21
|
+
}
|
|
22
|
+
},
|
|
23
|
+
"scripts": {
|
|
24
|
+
"build": "pnpm build:tokens-css && tsc -b && pnpm build:styles && pnpm build:manifest",
|
|
25
|
+
"build:tokens-css": "tsx scripts/build-tokens-css.ts",
|
|
26
|
+
"build:styles": "tsx scripts/build-styles.ts",
|
|
27
|
+
"build:manifest": "tsx scripts/build-manifest.ts",
|
|
28
|
+
"build-storybook": "storybook build",
|
|
29
|
+
"storybook": "storybook dev -p 6006",
|
|
30
|
+
"dev": "tsc -b -w",
|
|
31
|
+
"typecheck": "tsc --noEmit",
|
|
32
|
+
"test": "vitest run",
|
|
33
|
+
"validate": "tsx scripts/validate.ts",
|
|
34
|
+
"clean": "rm -rf dist .turbo storybook-static *.tsbuildinfo"
|
|
35
|
+
},
|
|
36
|
+
"dependencies": {
|
|
37
|
+
"@forumone/throughline-design-contract": "^{{version_design_contract}}",
|
|
38
|
+
"clsx": "^2.1.1"
|
|
39
|
+
},
|
|
40
|
+
"peerDependencies": {
|
|
41
|
+
"react": "^18.0.0 || ^19.0.0",
|
|
42
|
+
"react-dom": "^18.0.0 || ^19.0.0"
|
|
43
|
+
},
|
|
44
|
+
"devDependencies": {
|
|
45
|
+
"@storybook/addon-a11y": "^10.3.5",
|
|
46
|
+
"@storybook/react-vite": "^10.3.5",
|
|
47
|
+
"@testing-library/jest-dom": "^7.0.1",
|
|
48
|
+
"@testing-library/react": "^16.3.2",
|
|
49
|
+
"@types/node": "^20.17.0",
|
|
50
|
+
"@types/react": "^19.2.0",
|
|
51
|
+
"@types/react-dom": "^19.2.0",
|
|
52
|
+
"@vitejs/plugin-react": "^6.0.1",
|
|
53
|
+
"jsdom": "^29.0.2",
|
|
54
|
+
"react": "^19.2.0",
|
|
55
|
+
"react-dom": "^19.2.0",
|
|
56
|
+
"storybook": "^10.3.5",
|
|
57
|
+
"tsx": "^4.21.0",
|
|
58
|
+
"typescript": "^5.6.0",
|
|
59
|
+
"vite": "^8.0.9",
|
|
60
|
+
"vitest": "^4.1.10"
|
|
61
|
+
}
|
|
62
|
+
}
|