@picked/vite-plugin-picked 0.0.101-next.1 → 0.0.101-next.3
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/README.md +42 -0
- package/dist/cjs/index.js +1 -1
- package/dist/esm/index.js +1 -1
- package/package.json +6 -6
package/README.md
ADDED
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
# @picked/vite-plugin-picked
|
|
2
|
+
|
|
3
|
+
Embeds your Picked project's configuration and content in the bundle at build time, so the
|
|
4
|
+
SDK makes no configuration request at runtime. It also generates types and serves a preview
|
|
5
|
+
launcher during development.
|
|
6
|
+
|
|
7
|
+
## Install
|
|
8
|
+
|
|
9
|
+
```bash
|
|
10
|
+
npm install -D @picked/vite-plugin-picked
|
|
11
|
+
```
|
|
12
|
+
|
|
13
|
+
Supports Vite 7 and 8.
|
|
14
|
+
|
|
15
|
+
## Usage
|
|
16
|
+
|
|
17
|
+
```typescript
|
|
18
|
+
// vite.config.ts
|
|
19
|
+
import { defineConfig } from 'vite'
|
|
20
|
+
import { picked } from '@picked/vite-plugin-picked'
|
|
21
|
+
|
|
22
|
+
export default defineConfig({
|
|
23
|
+
plugins: [picked()],
|
|
24
|
+
})
|
|
25
|
+
```
|
|
26
|
+
|
|
27
|
+
The plugin reads the project from `picked.config.ts`. To type `virtual:picked/data`, add
|
|
28
|
+
`"@picked/vite-plugin-picked/client"` to `compilerOptions.types` in `tsconfig.json`.
|
|
29
|
+
|
|
30
|
+
| Option | Default | Description |
|
|
31
|
+
| ----------------- | -------------------- | -------------------------------------------------------------------------------- |
|
|
32
|
+
| `mode` | `'bundle'` | `'api'` skips the build-time fetch and reads everything from the API at runtime. |
|
|
33
|
+
| `generateTypes` | `true` | Generate types from the workspace schema on dev and build. |
|
|
34
|
+
| `disableLauncher` | `false` | Leave out the launcher page. |
|
|
35
|
+
| `telemetry` | from `picked.config` | Send anonymous build-time telemetry. |
|
|
36
|
+
|
|
37
|
+
## Docs
|
|
38
|
+
|
|
39
|
+
- **Web:** [Vite Plugin](https://docs.picked.app/reference/tools/vite-plugin)
|
|
40
|
+
- **Local:** `node_modules/picked/docs/reference/tools/vite-plugin.md`. The `picked` package carries every page under `node_modules/picked/docs/`.
|
|
41
|
+
- **CLI:** `npx picked docs read /reference/tools/vite-plugin`. `npx picked docs list [words]` lists the pages.
|
|
42
|
+
- **MCP:** call `read_picked_doc` with `{ "path": "/reference/tools/vite-plugin" }`; `list_picked_docs` lists the pages. Add the server with `claude mcp add --transport http picked https://api.picked.app/mcp`, or see [How to connect the MCP server](https://docs.picked.app/how-to/connect-the-mcp-server) for other tools.
|
package/dist/cjs/index.js
CHANGED
|
@@ -914,4 +914,4 @@ export const manifestMetadata = {
|
|
|
914
914
|
workspaceId: projectConfig?.workspaceId ?? null,
|
|
915
915
|
}
|
|
916
916
|
${s}`}var fe=5;function J(e,t,n){if(t.length===0)return;if(t.length>fe){console.log(`\n ${e}: ${t.length.toString()} loaded\n`);return}let r=n.map(e=>Math.max(e.header.length,...t.map(t=>e.value(t).length))),i=(e,t)=>e.padEnd(r[t]??e.length),a=` ${n.map((e,t)=>i(e.header,t)).join(` `)}`,o=` ${r.map(e=>`─`.repeat(e)).join(` `)}`,s=t.map(e=>` ${n.map((t,n)=>i(t.value(e),n)).join(` `)}`);console.log([``,` ${e}:`,``,a,o,...s,``].join(`
|
|
917
|
-
`))}function pe(e,t){t.length!==0&&console.log(`\n ${e}: ${t.length.toString()} loaded\n`)}var me=[{header:`Name`,value:e=>e.name},{header:`ID`,value:e=>e.id},{header:`Status`,value:e=>e.enabled?`\x1B[32m enabled\x1B[0m`:`\x1B[2mdisabled\x1B[0m`},{header:`Split`,value:e=>F(e)},{header:`Ver`,value:e=>`v${e.version.toString()}`}],he=[{header:`Name`,value:e=>e.name},{header:`Key`,value:e=>e.key},{header:`Component`,value:e=>e.componentName},{header:`Nodes`,value:e=>e.nodes.length.toString()},{header:`Targets`,value:e=>e.targets.length.toString()}],ge=[{header:`Name`,value:e=>e.name},{header:`Key`,value:e=>e.key},{header:`Fields`,value:e=>(e.fieldIds?.length??0).toString()}],_e=[{header:`Name`,value:e=>e.name},{header:`Key`,value:e=>e.key},{header:`Type`,value:e=>e.type},{header:`Required`,value:e=>e.required?`yes`:`no`}],ve=[{header:`Name`,value:e=>e.name},{header:`Key`,value:e=>e.key}];function ye(){return`0.0.101-next.
|
|
917
|
+
`))}function pe(e,t){t.length!==0&&console.log(`\n ${e}: ${t.length.toString()} loaded\n`)}var me=[{header:`Name`,value:e=>e.name},{header:`ID`,value:e=>e.id},{header:`Status`,value:e=>e.enabled?`\x1B[32m enabled\x1B[0m`:`\x1B[2mdisabled\x1B[0m`},{header:`Split`,value:e=>F(e)},{header:`Ver`,value:e=>`v${e.version.toString()}`}],he=[{header:`Name`,value:e=>e.name},{header:`Key`,value:e=>e.key},{header:`Component`,value:e=>e.componentName},{header:`Nodes`,value:e=>e.nodes.length.toString()},{header:`Targets`,value:e=>e.targets.length.toString()}],ge=[{header:`Name`,value:e=>e.name},{header:`Key`,value:e=>e.key},{header:`Fields`,value:e=>(e.fieldIds?.length??0).toString()}],_e=[{header:`Name`,value:e=>e.name},{header:`Key`,value:e=>e.key},{header:`Type`,value:e=>e.type},{header:`Required`,value:e=>e.required?`yes`:`no`}],ve=[{header:`Name`,value:e=>e.name},{header:`Key`,value:e=>e.key}];function ye(){return`0.0.101-next.3`}var be=`https://api.picked.app`,Y=`virtual:picked/data`,X=`\0${Y}`;function xe(e){for(let t of Object.values(e))if(t.type===`chunk`&&t.moduleIds.includes(X))return t.fileName}function Se(e,t){return e===``||e.endsWith(`/`)?`${e}${t}`:`${e}/${t}`}async function Ce(e){try{let t=await(0,r.generate)({config:e,onWarn:e=>{O.warn(e)}});O.info(`generated types at ${t.typesOutput}`)}catch(e){let t=e instanceof Error?e.message:String(e);throw Error(`type generation failed: ${t}. Fix the schema source, or set \`generateTypes: false\` on the picked plugin to skip it.`)}}function we(e,t,n){return e&&(0,i.isTelemetryEnabled)(t,n)?e:null}async function Te(e,t){let n=await(0,i.loadResolvedPickedConfig)(e,t);if(!n)throw Error(`picked.config.{ts,js,json} is required. Add a picked.config.ts with projectId and apiUrl.`);return n}function Z(e,t,n){if(t!==void 0&&n!==void 0&&t!==n)throw Error(`picked plugin option \`${e}\` is "${t}", and picked.config says "${n}". Remove the plugin option; picked.config is the one place this belongs.`)}function Ee(e){let t=[];if(e.projectId!==void 0&&t.push("`projectId`"),e.apiUrl!==void 0&&t.push("`apiUrl`"),t.length===0)return;let n=t.length>1;O.warn(`picked plugin option${n?`s`:``} ${t.join(` and `)} ${n?`are`:`is`} deprecated, and a future release drops ${n?`them`:`it`}. Move ${n?`them`:`it`} to picked.config, which the CLI and the type generator read from too.`)}async function De(e,t){let n=await(0,i.loadPickedConfig)(e);n&&n.projectId!==t&&O.warn(`using project "${t}" (picked.config default: "${n.projectId}") — run 'picked status' to inspect`)}var Q=new Map;function Oe(e,t,n){return JSON.stringify([e,t,n])}function ke(r={}){let a=r.mode??`bundle`,o=r.generateTypes??!0,s=[],c=process.cwd(),l=`serve`,u=`/`,d=null,f=!1,m,h,g=null,_=(0,i.isTelemetryForcedOffByEnvironment)()?null:U();return le(_,{name:`picked`,config:async(u,p)=>{l=p.command,c=u.root===void 0?process.cwd():(0,t.resolve)(process.cwd(),u.root);let{projectId:v,apiUrl:y}=r,b=await(0,i.loadPickedConfig)(c);Z(`projectId`,v,b?.projectId),Z(`apiUrl`,y,b?.apiUrl),Ee({projectId:v,apiUrl:y}),d=await Te(c,{projectId:v,apiUrl:y});let{projectId:x,apiUrl:S,previewToken:C}=d;_=we(_,d,r.telemetry),O.banner(),o&&!f&&(f=!0,await Ce(d)),S!==be&&O.warn(`using custom API URL: ${S}`),await De(c,x);let w=(0,n.createClientHeaders)(`vite-plugin`,ye());if(a===`api`)O.debug(`mode is 'api': skipping the project-config prefetch`);else if(p.command===`build`){let t=Oe(S,x,c);m=t;let n=Q.get(t);n===void 0&&(n=(async()=>{O.info(`prefetching project config + content for "${x}"`);let t=L(c),n=(0,e.existsSync)(t.pickedDir),r=performance.now(),i=await ce({apiUrl:S,projectId:x,projectRoot:c,headers:w,previewToken:C??void 0}),a=(performance.now()-r).toFixed(0);await ne(c,n);let o=i.config;return $(o,a),{virtualSource:ue({projectConfigPath:t.projectConfigPath,experienceContentPaths:i.experienceContentPaths,manifestMetadata:{mode:`build`,fetchedAt:i.manifest.fetchedAt,projectVersionId:i.manifest.projectVersionId,workspaceId:i.manifest.workspaceId}}),features:P(o.features)}})(),n.catch(()=>Q.delete(t)),Q.set(t,n));let r=await n;h=r.virtualSource,s=r.features}else if(p.mode===`production`)O.debug(`skipping the dev project-config fetch for a production serve resolution`);else{O.info(`fetching project config for "${x}" (dev)`);let e=performance.now(),t=()=>(0,n.fetchProject)(S,x,{headers:w,previewToken:C??void 0}),r=j(S)?await N(t,(e,t,n)=>{O.info(`local API not ready, retrying in ${(n/1e3).toString()}s (${e.toString()}/${t.toString()})`)}):await t(),i=(performance.now()-e).toFixed(0);g=r,r?(s=P(r.features),$(r,i)):O.warn(`failed to fetch project config for "${x}" (${i}ms)`)}},configResolved(e){u=e.base},closeBundle(){m!==void 0&&Q.delete(m),_?.flush({"picked.vite.command":l,"picked.data.mode":a,"picked.source":d?.source??`unknown`})},transformIndexHtml:{order:`post`,handler(e,t){if(a===`api`||t.bundle===void 0)return;let n=xe(t.bundle);if(n===void 0)return;let r=Se(u,n);if(!e.includes(`"${r}"`))return[{tag:`link`,attrs:{rel:`modulepreload`,crossorigin:!0,href:r},injectTo:`head`}]}},resolveId(e){if(e===Y)return X},load(e){if(e===X){if(a===`api`)return q();if(l===`build`)return h;if(!d)throw Error(`picked plugin config hook must run before virtual module load`);return de({apiUrl:d.apiUrl,projectId:d.projectId,projectConfig:g,previewToken:d.previewToken??void 0})}},configureServer(e){if(r.disableLauncher)return;e.middlewares.use(te(()=>p(s)));let t=e.printUrls.bind(e);e.printUrls=()=>{let n=e.resolvedUrls?.local[0];if(n){let e=n.replace(/:(?<port>\d+)\//,(e,t)=>`:\x1b[1m${t}\x1b[22m/`);console.log(` \x1b[32m➜\x1b[0m \x1b[1mPicked\x1b[22m: \x1b[36m${e}\x1b[0m`)}t()}},generateBundle:{order:`post`,handler(e,t){if(!r.disableLauncher){if(`index.html`in t){O.debug(`index.html came from the build; skipping the launcher page`);return}this.emitFile({type:`asset`,fileName:`index.html`,source:p(s)})}}}})}function $(e,t){let n=P(e.features),r=P(e.experiences),i=P(e.steps),a=P(e.fields),o=P(e.conditions),s=P(e.actions),c=JSON.stringify(e).length,l=[`${n.length.toString()} features`,`${r.length.toString()} experiences`,`${i.length.toString()} steps`,`${a.length.toString()} fields`,`${o.length.toString()} conditions`,`${s.length.toString()} actions`].join(`, `);O.info(`fetched config in ${t}ms (${l})`),J(`Features`,n,me),J(`Experiences`,r,he),J(`Steps`,i,ge),J(`Fields`,a,_e),J(`Conditions`,o,ve),pe(`Actions`,s),O.debug(`config size: ${c.toString()} bytes`)}exports.picked=ke;
|
package/dist/esm/index.js
CHANGED
package/package.json
CHANGED
|
@@ -1,13 +1,13 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@picked/vite-plugin-picked",
|
|
3
3
|
"description": "Vite plugin for build-time config injection",
|
|
4
|
-
"version": "0.0.101-next.
|
|
4
|
+
"version": "0.0.101-next.3",
|
|
5
5
|
"dependencies": {
|
|
6
|
-
"@picked/client": "0.0.101-next.
|
|
7
|
-
"@picked/config": "0.0.101-next.
|
|
8
|
-
"@picked/delivery-api-client": "0.0.101-next.
|
|
9
|
-
"@picked/telemetry": "0.0.101-next.
|
|
10
|
-
"@picked/typegen": "0.0.101-next.
|
|
6
|
+
"@picked/client": "0.0.101-next.3",
|
|
7
|
+
"@picked/config": "0.0.101-next.3",
|
|
8
|
+
"@picked/delivery-api-client": "0.0.101-next.3",
|
|
9
|
+
"@picked/telemetry": "0.0.101-next.3",
|
|
10
|
+
"@picked/typegen": "0.0.101-next.3"
|
|
11
11
|
},
|
|
12
12
|
"devDependencies": {
|
|
13
13
|
"@repo/eslint-config": "workspace:*",
|