Type-safe parameter definitions for CADit scripts
npm install @cadit-app/script-paramsType-safe parameter definitions for CADit parametric scripts.
``bash`
npm install @cadit-app/script-params
`typescript
import { defineParams } from '@cadit-app/script-params';
export default defineParams({
params: {
size: { type: 'number', default: 10, min: 1, max: 100 },
label: { type: 'text', default: 'Hello' },
hollow: { type: 'boolean', default: false },
},
main: (params) => {
// params.size is number
// params.label is string
// params.hollow is boolean
return createModel(params.size, params.label, params.hollow);
},
});
`
- Type-safe parameters - Full TypeScript inference without as const
- Default values - Scripts work standalone when params are undefined
- UI generation - Schema can be converted to UI controls
- Exporters - Define custom export formats (SVG, PNG, etc.)
- Simple API - Just one function to learn
| Type | Value Type | Additional Options |
|------|------------|-------------------|
| number | number | min, max, step |int
| | number | min, max, step |text
| | string | maxLength, placeholder |boolean
| | boolean | - |choice
| | string | options: string[] or options: { value, label }[] |slider
| | number | min, max, step (required: min, max) |buttonGrid
| | string | options: { value, image?, caption? }[] |image
| | ImageFileValue \| null | - |embedded
| | EmbeddedParamValue | params, enabled?, showSettings? |
Define parameters for a script. Pass a config object with params (required), and optionally main and exporters.
Basic usage:
`typescript`
export default defineParams({
params: {
size: { type: 'number', default: 10 },
},
main: (params) => Manifold.cube([params.size, params.size, params.size]),
});
// Returns a callable ScriptModule
With exporters:
`typescript`
export default defineParams({
params: {
size: { type: 'number', default: 10 },
},
exporters: {
svg: {
name: 'SVG',
label: 'Download SVG',
export: async (params) => ({
mimeType: 'image/svg+xml',
fileName: 'model.svg',
data: generateSvg(params),
}),
},
},
main: (params) => Manifold.cube([params.size, params.size, params.size]),
});
Without main (add main separately):
`typescript
const script = defineParams({
params: { size: { type: 'number', default: 10 } },
exporters: { svg: svgExporter },
});
export default createMain(script, myMainFunction);
`
Add a main function to a ScriptModule. Preserves any exporters.
`typescript
const script = defineParams({
params: { size: { type: 'number', default: 10 } },
exporters: { svg: svgExporter },
});
export default createMain(script, (p) => Manifold.cube([p.size, ...]));
`
Type helper to get the params object type from a schema.
`typescript
const script = defineParams({
params: {
size: { type: 'number', default: 10 },
},
});
type MyParams = Params
// { size: number }
`
Convert object-based schema to array format for legacy UI compatibility.
`typescript`
const array = schemaToArray({
size: { type: 'number', default: 10 },
});
// [{ name: 'size', type: 'number', initial: 10, caption: 'size' }]
Extract default values from a schema.
`typescript`
const defaults = getDefaults({
size: { type: 'number', default: 10 },
label: { type: 'text', default: 'Hi' },
});
// { size: 10, label: 'Hi' }
Check if a value is a ScriptModule created by defineParams.
`typescript`
const mod = await import('./script.ts');
if (isScriptModule(mod.default)) {
const result = mod.default({ size: 20 });
}
Extract the parameter schema from a ScriptModule.
`typescript`
const qrParams = getParams(qrCodeScript);
Extract exporters from a ScriptModule.
`typescript`
const exporters = getExporters(script);
// { svg: { name: 'SVG', ... }, png: { name: 'PNG', ... } }
Exporters allow scripts to define custom download formats:
`typescript
import { defineParams, Exporter, ExportResult } from '@cadit-app/script-params';
const svgExporter: Exporter = {
name: 'SVG',
label: 'Download SVG',
description: 'Export as scalable vector graphic',
export: async (params): Promise
mimeType: 'image/svg+xml',
fileName: 'output.svg',
data: generateSvgFromParams(params),
}),
};
export default defineParams({
params: {
size: { type: 'number', default: 10 },
},
exporters: { svg: svgExporter },
main: (params) => generateGeometry(params),
});
``
MIT