@happyvertical/smrt-core 0.55.23 → 0.56.0
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/agents/build-knowledge.md +11 -0
- package/agents/collection-reads.md +6 -3
- package/agents/generators.md +16 -0
- package/agents/object-runtime.md +3 -0
- package/agents/recipes.md +7 -4
- package/dist/browser.d.ts +1 -0
- package/dist/browser.d.ts.map +1 -1
- package/dist/browser.js +3 -2
- package/dist/collection.d.ts +4 -0
- package/dist/collection.d.ts.map +1 -1
- package/dist/collection.js +19 -9
- package/dist/collection.js.map +1 -1
- package/dist/consumer-plugin/hosted-sti-collections.d.ts.map +1 -1
- package/dist/consumer-plugin/hosted-sti-collections.js +4 -2
- package/dist/consumer-plugin/hosted-sti-collections.js.map +1 -1
- package/dist/decorators/index.d.ts +9 -0
- package/dist/decorators/index.d.ts.map +1 -1
- package/dist/decorators/index.js.map +1 -1
- package/dist/generators/mcp.d.ts.map +1 -1
- package/dist/generators/mcp.js +4 -2
- package/dist/generators/mcp.js.map +1 -1
- package/dist/generators/preflight-route.d.ts.map +1 -1
- package/dist/generators/preflight-route.js +3 -1
- package/dist/generators/preflight-route.js.map +1 -1
- package/dist/generators/rest.d.ts.map +1 -1
- package/dist/generators/rest.js +5 -0
- package/dist/generators/rest.js.map +1 -1
- package/dist/generators/swagger.d.ts.map +1 -1
- package/dist/generators/swagger.js +3 -1
- package/dist/generators/swagger.js.map +1 -1
- package/dist/index.d.ts +1 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +3 -2
- package/dist/manifest/static-manifest.d.ts.map +1 -1
- package/dist/manifest/static-manifest.js +9 -1
- package/dist/manifest/static-manifest.js.map +1 -1
- package/dist/manifest/store.js +1 -1
- package/dist/manifest/store.js.map +1 -1
- package/dist/manifest.json +9 -1
- package/dist/object.d.ts +2 -0
- package/dist/object.d.ts.map +1 -1
- package/dist/object.js +51 -0
- package/dist/object.js.map +1 -1
- package/dist/operation-permission.d.ts +10 -0
- package/dist/operation-permission.d.ts.map +1 -0
- package/dist/operation-permission.js +36 -0
- package/dist/operation-permission.js.map +1 -0
- package/dist/prebuild/index.d.ts.map +1 -1
- package/dist/prebuild/index.js +2 -0
- package/dist/prebuild/index.js.map +1 -1
- package/dist/registry/class-registration.d.ts.map +1 -1
- package/dist/registry/class-registration.js +12 -0
- package/dist/registry/class-registration.js.map +1 -1
- package/dist/registry/types.d.ts +5 -3
- package/dist/registry/types.d.ts.map +1 -1
- package/dist/scanner/manifest-generator.d.ts.map +1 -1
- package/dist/scanner/manifest-generator.js +59 -2
- package/dist/scanner/manifest-generator.js.map +1 -1
- package/dist/scanner/types.d.ts +18 -0
- package/dist/scanner/types.d.ts.map +1 -1
- package/dist/scanner/types.js.map +1 -1
- package/dist/smrt-knowledge.json +18 -13
- package/dist/ui-metadata.d.ts +13 -0
- package/dist/ui-metadata.d.ts.map +1 -1
- package/dist/ui-metadata.js +26 -1
- package/dist/ui-metadata.js.map +1 -1
- package/dist/vite-plugin/api-client-entries.d.ts.map +1 -1
- package/dist/vite-plugin/api-client-entries.js +1 -0
- package/dist/vite-plugin/api-client-entries.js.map +1 -1
- package/dist/vite-plugin/index.d.ts.map +1 -1
- package/dist/vite-plugin/index.js +2 -0
- package/dist/vite-plugin/index.js.map +1 -1
- package/dist/vite-plugin/sveltekit-generator.d.ts +0 -4
- package/dist/vite-plugin/sveltekit-generator.d.ts.map +1 -1
- package/dist/vite-plugin/sveltekit-generator.js +36 -24
- package/dist/vite-plugin/sveltekit-generator.js.map +1 -1
- package/dist/vite-plugin/web-collections.d.ts +6 -0
- package/dist/vite-plugin/web-collections.d.ts.map +1 -1
- package/dist/vite-plugin/web-collections.js +6 -3
- package/dist/vite-plugin/web-collections.js.map +1 -1
- package/package.json +10 -10
package/dist/ui-metadata.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ui-metadata.js","names":[],"sources":["../src/ui-metadata.ts"],"sourcesContent":["/**\n * Presentation metadata helpers (#3599): `@field({ ui: { widget } })` hints,\n * the own-field display label, and selector-slot lookup.\n *\n * Pure and dependency-free so it is safe in browser bundles\n * (`@happyvertical/smrt-core/ui-metadata`). The manifest generator, the MCP /\n * WebMCP tool descriptors, the knowledge projection and host UIs all read the\n * same rules from here.\n */\n\nimport type {\n ManifestUISelector,\n QualifiedClassName,\n SmartObjectManifest,\n} from './scanner/types.js';\n\n/** Widget hints a field may declare via `@field({ ui: { widget } })`. */\nexport const FIELD_UI_WIDGETS = [\n 'textarea',\n 'currency',\n 'email',\n 'url',\n 'phone',\n] as const;\n\nexport type FieldUIWidget = (typeof FIELD_UI_WIDGETS)[number];\n\n/** Manifest field types each widget may be applied to. */\nexport const FIELD_UI_WIDGET_TYPES: Readonly<\n Record<FieldUIWidget, readonly string[]>\n> = {\n textarea: ['text'],\n email: ['text'],\n url: ['text'],\n phone: ['text'],\n // A currency CODE (ISO 4217, e.g. `currency: string = 'USD'`) picker, not an\n // amount: amounts are integer minor units and need no widget hint.\n currency: ['text'],\n};\n\nexport function isFieldUIWidget(value: unknown): value is FieldUIWidget {\n return (\n typeof value === 'string' &&\n (FIELD_UI_WIDGETS as readonly string[]).includes(value)\n );\n}\n\n/**\n * Fields tried, in order, when a model declares no\n * `@smrt({ display: { label } })`.\n */\nexport const DEFAULT_DISPLAY_LABEL_FIELDS = [\n 'name',\n 'title',\n 'label',\n 'code',\n] as const;\n\n/** Field kinds that can never be a record's label (they are not its own value). */\nconst NON_LABEL_FIELD_TYPES = new Set([\n 'foreignKey',\n 'crossPackageRef',\n 'oneToMany',\n 'manyToMany',\n 'json',\n 'meta',\n]);\n\ninterface LabelCandidate {\n type?: string;\n sensitive?: boolean;\n transient?: boolean;\n _meta?: { sensitive?: unknown; transient?: unknown } | undefined;\n}\n\n/**\n * Why `fieldName` cannot label a record of this model, or `null` when it can.\n * Used both to validate an explicit declaration and to filter the default\n * candidates.\n */\nexport function displayLabelFieldProblem(\n fields: Record<string, LabelCandidate>,\n fieldName: string,\n): string | null {\n const field = fields[fieldName];\n if (!field) return `it is not a field of this model`;\n if (field.sensitive === true || field._meta?.sensitive === true) {\n return `it is a sensitive field`;\n }\n if (field.transient === true || field._meta?.transient === true) {\n return `it is a transient field`;\n }\n if (field.type && NON_LABEL_FIELD_TYPES.has(field.type)) {\n return `a ${field.type} field is not the record's own value`;\n }\n return null;\n}\n\n/**\n * The own field generic pickers and assistants use to label a record: the\n * declared `display.label` when present, otherwise the first of\n * {@link DEFAULT_DISPLAY_LABEL_FIELDS} that is a usable own field. `undefined`\n * when the model has none (it should then ship a selector).\n */\nexport function resolveDisplayLabelField(\n fields: Record<string, LabelCandidate>,\n declared?: string,\n): string | undefined {\n if (declared !== undefined) {\n return displayLabelFieldProblem(fields, declared) === null\n ? declared\n : undefined;\n }\n return DEFAULT_DISPLAY_LABEL_FIELDS.find(\n (name) => displayLabelFieldProblem(fields, name) === null,\n );\n}\n\n/**\n * Sentence appended to generated tool descriptions (#3599), including its\n * leading separator; empty when the model has no label field.\n */\nexport function describeDisplayLabel(labelField: string | undefined): string {\n return labelField\n ? `. Records are identified by their \\`${labelField}\\` field.`\n : '';\n}\n\ntype SelectorHost = Pick<SmartObjectManifest, 'uiSelectors'>;\n\n/**\n * The selector slot registered for a model, or `undefined`. Hosts render the\n * package-owned component registered under `slot.slotId` for any\n * `@foreignKey` / `@crossPackageRef` field whose target is `qualifiedName`, and\n * fall back to a generic picker labelled by the model's display label field.\n *\n * Pass every manifest in scope; the first selector found wins.\n */\nexport function findSelectorFor(\n manifests: SelectorHost | readonly SelectorHost[],\n qualifiedName: QualifiedClassName | string,\n): ManifestUISelector | undefined {\n const list = Array.isArray(manifests)\n ? (manifests as readonly SelectorHost[])\n : [manifests as SelectorHost];\n for (const manifest of list) {\n for (const selector of Object.values(manifest.uiSelectors ?? {})) {\n if (selector.selects === qualifiedName) return selector;\n }\n }\n return undefined;\n}\n"],"mappings":";;AAiBA,IAAa,mBAAmB;CAC9B;CACA;CACA;CACA;CACA;AACF;;AAKA,IAAa,wBAET;CACF,UAAU,CAAC,MAAM;CACjB,OAAO,CAAC,MAAM;CACd,KAAK,CAAC,MAAM;CACZ,OAAO,CAAC,MAAM;CAGd,UAAU,CAAC,MAAM;AACnB;AAEA,SAAgB,gBAAgB,OAAwC;CACtE,OACE,OAAO,UAAU,YAChB,iBAAuC,SAAS,KAAK;AAE1D;;;;;AAMA,IAAa,+BAA+B;CAC1C;CACA;CACA;CACA;AACF;;AAGA,IAAM,wCAAwB,IAAI,IAAI;CACpC;CACA;CACA;CACA;CACA;CACA;AACF,CAAC;;;;;;AAcD,SAAgB,yBACd,QACA,WACe;CACf,MAAM,QAAQ,OAAO;CACrB,IAAI,CAAC,OAAO,OAAO;CACnB,IAAI,MAAM,cAAc,QAAQ,MAAM,OAAO,cAAc,MACzD,OAAO;CAET,IAAI,MAAM,cAAc,QAAQ,MAAM,OAAO,cAAc,MACzD,OAAO;CAET,IAAI,MAAM,QAAQ,sBAAsB,IAAI,MAAM,IAAI,GACpD,OAAO,KAAK,MAAM,KAAK;CAEzB,OAAO;AACT;;;;;;;AAQA,SAAgB,yBACd,QACA,UACoB;CACpB,IAAI,aAAa,KAAA,GACf,OAAO,yBAAyB,QAAQ,QAAQ,MAAM,OAClD,WACA,KAAA;CAEN,OAAO,6BAA6B,MACjC,SAAS,yBAAyB,QAAQ,IAAI,MAAM,IACvD;AACF;;;;;AAMA,SAAgB,qBAAqB,YAAwC;CAC3E,OAAO,aACH,uCAAuC,WAAW,aAClD;AACN;;;;;;;;;AAYA,SAAgB,gBACd,WACA,eACgC;CAChC,MAAM,OAAO,MAAM,QAAQ,SAAS,IAC/B,YACD,CAAC,SAAyB;CAC9B,KAAK,MAAM,YAAY,MACrB,KAAK,MAAM,YAAY,OAAO,OAAO,SAAS,eAAe,CAAC,CAAC,GAC7D,IAAI,SAAS,YAAY,eAAe,OAAO;AAIrD"}
|
|
1
|
+
{"version":3,"file":"ui-metadata.js","names":[],"sources":["../src/ui-metadata.ts"],"sourcesContent":["/**\n * Presentation metadata helpers (#3599): `@field({ ui: { widget } })` hints,\n * the own-field display label, and selector-slot lookup.\n *\n * Pure and dependency-free so it is safe in browser bundles\n * (`@happyvertical/smrt-core/ui-metadata`). The manifest generator, the MCP /\n * WebMCP tool descriptors, the knowledge projection and host UIs all read the\n * same rules from here.\n */\n\nimport type {\n ManifestUISelector,\n QualifiedClassName,\n SmartObjectManifest,\n} from './scanner/types.js';\n\n/** Widget hints a field may declare via `@field({ ui: { widget } })`. */\nexport const FIELD_UI_WIDGETS = [\n 'textarea',\n 'currency',\n 'email',\n 'url',\n 'phone',\n] as const;\n\nexport type FieldUIWidget = (typeof FIELD_UI_WIDGETS)[number];\n\n/** Manifest field types each widget may be applied to. */\nexport const FIELD_UI_WIDGET_TYPES: Readonly<\n Record<FieldUIWidget, readonly string[]>\n> = {\n textarea: ['text'],\n email: ['text'],\n url: ['text'],\n phone: ['text'],\n // A currency CODE (ISO 4217, e.g. `currency: string = 'USD'`) picker, not an\n // amount: amounts are integer minor units and need no widget hint.\n currency: ['text'],\n};\n\nexport function isFieldUIWidget(value: unknown): value is FieldUIWidget {\n return (\n typeof value === 'string' &&\n (FIELD_UI_WIDGETS as readonly string[]).includes(value)\n );\n}\n\n/** Presentation formats a field may declare via `@field({ ui: { format } })`. */\nexport const FIELD_UI_FORMATS = [\n 'money',\n 'date',\n 'datetime',\n 'percent',\n] as const;\n\nexport type FieldUIFormat = (typeof FIELD_UI_FORMATS)[number];\n\n/**\n * Manifest field types each format may be applied to. Money is integer\n * minor units only (rates and confidences are the only decimals).\n */\nexport const FIELD_UI_FORMAT_TYPES: Readonly<\n Record<FieldUIFormat, readonly string[]>\n> = {\n money: ['integer'],\n date: ['datetime'],\n datetime: ['datetime'],\n percent: ['decimal', 'integer'],\n};\n\nexport function isFieldUIFormat(value: unknown): value is FieldUIFormat {\n return (\n typeof value === 'string' &&\n (FIELD_UI_FORMATS as readonly string[]).includes(value)\n );\n}\n\n/** Relationship roles a `foreignKey` / `crossPackageRef` may declare. */\nexport const RELATIONSHIP_ROLES = ['items'] as const;\n\nexport type RelationshipRole = (typeof RELATIONSHIP_ROLES)[number];\n\nexport function isRelationshipRole(value: unknown): value is RelationshipRole {\n return (\n typeof value === 'string' &&\n (RELATIONSHIP_ROLES as readonly string[]).includes(value)\n );\n}\n\n/**\n * Fields tried, in order, when a model declares no\n * `@smrt({ display: { label } })`.\n */\nexport const DEFAULT_DISPLAY_LABEL_FIELDS = [\n 'name',\n 'title',\n 'label',\n 'code',\n] as const;\n\n/** Field kinds that can never be a record's label (they are not its own value). */\nconst NON_LABEL_FIELD_TYPES = new Set([\n 'foreignKey',\n 'crossPackageRef',\n 'oneToMany',\n 'manyToMany',\n 'json',\n 'meta',\n]);\n\ninterface LabelCandidate {\n type?: string;\n sensitive?: boolean;\n transient?: boolean;\n _meta?: { sensitive?: unknown; transient?: unknown } | undefined;\n}\n\n/**\n * Why `fieldName` cannot label a record of this model, or `null` when it can.\n * Used both to validate an explicit declaration and to filter the default\n * candidates.\n */\nexport function displayLabelFieldProblem(\n fields: Record<string, LabelCandidate>,\n fieldName: string,\n): string | null {\n const field = fields[fieldName];\n if (!field) return `it is not a field of this model`;\n if (field.sensitive === true || field._meta?.sensitive === true) {\n return `it is a sensitive field`;\n }\n if (field.transient === true || field._meta?.transient === true) {\n return `it is a transient field`;\n }\n if (field.type && NON_LABEL_FIELD_TYPES.has(field.type)) {\n return `a ${field.type} field is not the record's own value`;\n }\n return null;\n}\n\n/**\n * The own field generic pickers and assistants use to label a record: the\n * declared `display.label` when present, otherwise the first of\n * {@link DEFAULT_DISPLAY_LABEL_FIELDS} that is a usable own field. `undefined`\n * when the model has none (it should then ship a selector).\n */\nexport function resolveDisplayLabelField(\n fields: Record<string, LabelCandidate>,\n declared?: string,\n): string | undefined {\n if (declared !== undefined) {\n return displayLabelFieldProblem(fields, declared) === null\n ? declared\n : undefined;\n }\n return DEFAULT_DISPLAY_LABEL_FIELDS.find(\n (name) => displayLabelFieldProblem(fields, name) === null,\n );\n}\n\n/**\n * Sentence appended to generated tool descriptions (#3599), including its\n * leading separator; empty when the model has no label field.\n */\nexport function describeDisplayLabel(labelField: string | undefined): string {\n return labelField\n ? `. Records are identified by their \\`${labelField}\\` field.`\n : '';\n}\n\ntype SelectorHost = Pick<SmartObjectManifest, 'uiSelectors'>;\n\n/**\n * The selector slot registered for a model, or `undefined`. Hosts render the\n * package-owned component registered under `slot.slotId` for any\n * `@foreignKey` / `@crossPackageRef` field whose target is `qualifiedName`, and\n * fall back to a generic picker labelled by the model's display label field.\n *\n * Pass every manifest in scope; the first selector found wins.\n */\nexport function findSelectorFor(\n manifests: SelectorHost | readonly SelectorHost[],\n qualifiedName: QualifiedClassName | string,\n): ManifestUISelector | undefined {\n const list = Array.isArray(manifests)\n ? (manifests as readonly SelectorHost[])\n : [manifests as SelectorHost];\n for (const manifest of list) {\n for (const selector of Object.values(manifest.uiSelectors ?? {})) {\n if (selector.selects === qualifiedName) return selector;\n }\n }\n return undefined;\n}\n"],"mappings":";;AAiBA,IAAa,mBAAmB;CAC9B;CACA;CACA;CACA;CACA;AACF;;AAKA,IAAa,wBAET;CACF,UAAU,CAAC,MAAM;CACjB,OAAO,CAAC,MAAM;CACd,KAAK,CAAC,MAAM;CACZ,OAAO,CAAC,MAAM;CAGd,UAAU,CAAC,MAAM;AACnB;AAEA,SAAgB,gBAAgB,OAAwC;CACtE,OACE,OAAO,UAAU,YAChB,iBAAuC,SAAS,KAAK;AAE1D;;AAGA,IAAa,mBAAmB;CAC9B;CACA;CACA;CACA;AACF;;;;;AAQA,IAAa,wBAET;CACF,OAAO,CAAC,SAAS;CACjB,MAAM,CAAC,UAAU;CACjB,UAAU,CAAC,UAAU;CACrB,SAAS,CAAC,WAAW,SAAS;AAChC;AAEA,SAAgB,gBAAgB,OAAwC;CACtE,OACE,OAAO,UAAU,YAChB,iBAAuC,SAAS,KAAK;AAE1D;;AAGA,IAAa,qBAAqB,CAAC,OAAO;AAI1C,SAAgB,mBAAmB,OAA2C;CAC5E,OACE,OAAO,UAAU,YAChB,mBAAyC,SAAS,KAAK;AAE5D;;;;;AAMA,IAAa,+BAA+B;CAC1C;CACA;CACA;CACA;AACF;;AAGA,IAAM,wCAAwB,IAAI,IAAI;CACpC;CACA;CACA;CACA;CACA;CACA;AACF,CAAC;;;;;;AAcD,SAAgB,yBACd,QACA,WACe;CACf,MAAM,QAAQ,OAAO;CACrB,IAAI,CAAC,OAAO,OAAO;CACnB,IAAI,MAAM,cAAc,QAAQ,MAAM,OAAO,cAAc,MACzD,OAAO;CAET,IAAI,MAAM,cAAc,QAAQ,MAAM,OAAO,cAAc,MACzD,OAAO;CAET,IAAI,MAAM,QAAQ,sBAAsB,IAAI,MAAM,IAAI,GACpD,OAAO,KAAK,MAAM,KAAK;CAEzB,OAAO;AACT;;;;;;;AAQA,SAAgB,yBACd,QACA,UACoB;CACpB,IAAI,aAAa,KAAA,GACf,OAAO,yBAAyB,QAAQ,QAAQ,MAAM,OAClD,WACA,KAAA;CAEN,OAAO,6BAA6B,MACjC,SAAS,yBAAyB,QAAQ,IAAI,MAAM,IACvD;AACF;;;;;AAMA,SAAgB,qBAAqB,YAAwC;CAC3E,OAAO,aACH,uCAAuC,WAAW,aAClD;AACN;;;;;;;;;AAYA,SAAgB,gBACd,WACA,eACgC;CAChC,MAAM,OAAO,MAAM,QAAQ,SAAS,IAC/B,YACD,CAAC,SAAyB;CAC9B,KAAK,MAAM,YAAY,MACrB,KAAK,MAAM,YAAY,OAAO,OAAO,SAAS,eAAe,CAAC,CAAC,GAC7D,IAAI,SAAS,YAAY,eAAe,OAAO;AAIrD"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"api-client-entries.d.ts","sourceRoot":"","sources":["../../src/vite-plugin/api-client-entries.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAOH,OAAO,KAAK,EACV,qBAAqB,EACrB,mBAAmB,EACpB,MAAM,qBAAqB,CAAC;AAS7B,MAAM,MAAM,mBAAmB,GAC3B,MAAM,GACN,KAAK,GACL,QAAQ,GACR,QAAQ,GACR,QAAQ,GACR,QAAQ,CAAC;AAEb,MAAM,WAAW,cAAc;IAC7B,wCAAwC;IACxC,UAAU,EAAE,MAAM,CAAC;IACnB,wEAAwE;IACxE,GAAG,EAAE,qBAAqB,CAAC;IAC3B,6EAA6E;IAC7E,SAAS,EAAE,MAAM,CAAC;IAClB,iEAAiE;IACjE,iBAAiB,EAAE,MAAM,CAAC;IAC1B,2EAA2E;IAC3E,WAAW,EAAE,mBAAmB,EAAE,CAAC;IACnC,sEAAsE;IACtE,aAAa,EAAE,KAAK,CAAC;QACnB,IAAI,EAAE,MAAM,CAAC;QACb,KAAK,EAAE,MAAM,GAAG,YAAY,CAAC;QAC7B,cAAc,EAAE,MAAM,EAAE,CAAC;QACzB,UAAU,EAAE,KAAK,CAAC;YAChB,IAAI,EAAE,MAAM,CAAC;YACb,IAAI,EAAE,MAAM,CAAC;YACb,QAAQ,CAAC,EAAE,OAAO,CAAC;YACnB,OAAO,CAAC,EAAE,OAAO,CAAC;SACnB,CAAC,CAAC;KACJ,CAAC,CAAC;CACJ;AAED,wBAAgB,uBAAuB,CACrC,iBAAiB,EAAE,MAAM,EACzB,WAAW,EAAE,mBAAmB,EAAE,EAClC,iBAAiB,GAAE,MAAM,EAAO,GAC/B,MAAM,GAAG,SAAS,CAepB;AAED,wBAAgB,qCAAqC,CACnD,MAAM,EAAE,cAAc,CAAC,eAAe,CAAC,CAAC,MAAM,CAAC,EAC/C,OAAO,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,MAAM,GAChC,MAAM,CAyCR;
|
|
1
|
+
{"version":3,"file":"api-client-entries.d.ts","sourceRoot":"","sources":["../../src/vite-plugin/api-client-entries.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAOH,OAAO,KAAK,EACV,qBAAqB,EACrB,mBAAmB,EACpB,MAAM,qBAAqB,CAAC;AAS7B,MAAM,MAAM,mBAAmB,GAC3B,MAAM,GACN,KAAK,GACL,QAAQ,GACR,QAAQ,GACR,QAAQ,GACR,QAAQ,CAAC;AAEb,MAAM,WAAW,cAAc;IAC7B,wCAAwC;IACxC,UAAU,EAAE,MAAM,CAAC;IACnB,wEAAwE;IACxE,GAAG,EAAE,qBAAqB,CAAC;IAC3B,6EAA6E;IAC7E,SAAS,EAAE,MAAM,CAAC;IAClB,iEAAiE;IACjE,iBAAiB,EAAE,MAAM,CAAC;IAC1B,2EAA2E;IAC3E,WAAW,EAAE,mBAAmB,EAAE,CAAC;IACnC,sEAAsE;IACtE,aAAa,EAAE,KAAK,CAAC;QACnB,IAAI,EAAE,MAAM,CAAC;QACb,KAAK,EAAE,MAAM,GAAG,YAAY,CAAC;QAC7B,cAAc,EAAE,MAAM,EAAE,CAAC;QACzB,UAAU,EAAE,KAAK,CAAC;YAChB,IAAI,EAAE,MAAM,CAAC;YACb,IAAI,EAAE,MAAM,CAAC;YACb,QAAQ,CAAC,EAAE,OAAO,CAAC;YACnB,OAAO,CAAC,EAAE,OAAO,CAAC;SACnB,CAAC,CAAC;KACJ,CAAC,CAAC;CACJ;AAED,wBAAgB,uBAAuB,CACrC,iBAAiB,EAAE,MAAM,EACzB,WAAW,EAAE,mBAAmB,EAAE,EAClC,iBAAiB,GAAE,MAAM,EAAO,GAC/B,MAAM,GAAG,SAAS,CAepB;AAED,wBAAgB,qCAAqC,CACnD,MAAM,EAAE,cAAc,CAAC,eAAe,CAAC,CAAC,MAAM,CAAC,EAC/C,OAAO,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,MAAM,GAChC,MAAM,CAyCR;AAqTD;;;;GAIG;AACH,wBAAgB,sBAAsB,CACpC,QAAQ,EAAE,mBAAmB,GAC5B,cAAc,EAAE,CAwElB"}
|
|
@@ -73,6 +73,7 @@ function resolveGeneratedClientCustomMethods(obj, manifest) {
|
|
|
73
73
|
const apiConfig = obj.decoratorConfig?.api;
|
|
74
74
|
if (apiConfig === false) return [];
|
|
75
75
|
const isCollection = isCollectionManifestClass(manifest, obj);
|
|
76
|
+
if (isCollection && resolveCollectionItemObject(manifest, obj)?.decoratorConfig?.abstract === true) return [];
|
|
76
77
|
const isModelClassName = createManifestClassNamePredicate(manifest);
|
|
77
78
|
return Object.entries(obj.methods ?? {}).flatMap(([name, method]) => {
|
|
78
79
|
if (!resolveApiMethodExposure({
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"api-client-entries.js","names":[],"sources":["../../src/vite-plugin/api-client-entries.ts"],"sourcesContent":["/**\n * Manifest -> generated API-client entry selection.\n *\n * Runtime client values, Vite ambient declarations, and physical prebuild\n * declarations must agree on which manifest object owns a collection's\n * canonical endpoint. Collection classes describe access methods, not row\n * payloads, so a populated model always wins the shared collection key.\n */\n\nimport {\n CRUD_OPERATIONS,\n createManifestClassNamePredicate,\n resolveApiMethodExposure,\n} from '../generators/custom-action.js';\nimport type {\n SmartObjectDefinition,\n SmartObjectManifest,\n} from '../scanner/types.js';\nimport { resolveApiActionRouteConfig } from './sveltekit-generator.js';\nimport {\n findManifestObjectByName,\n isCollectionManifestClass,\n orderedManifestObjectEntries,\n resolveCollectionItemObject,\n} from './web-collections.js';\n\nexport type ApiClientCrudMethod =\n | 'list'\n | 'get'\n | 'create'\n | 'update'\n | 'delete'\n | 'search';\n\nexport interface ApiClientEntry {\n /** Original key in manifest.objects. */\n objectName: string;\n /** Object whose routes and custom methods this client entry exposes. */\n obj: SmartObjectDefinition;\n /** Canonical collection key or deterministic class-derived secondary key. */\n clientKey: string;\n /** Row-payload interface used by CRUD methods for this entry. */\n dataInterfaceName: string;\n /** Standard client operations whose server routes are actually emitted. */\n crudMethods: ApiClientCrudMethod[];\n /** Custom methods whose routes are actually emitted by the server. */\n customMethods: Array<{\n name: string;\n scope: 'item' | 'collection';\n pathParamNames: string[];\n parameters: Array<{\n name: string;\n type: string;\n optional?: boolean;\n default?: unknown;\n }>;\n }>;\n}\n\nexport function renderApiClientCrudType(\n dataInterfaceName: string,\n crudMethods: ApiClientCrudMethod[],\n overriddenMethods: string[] = [],\n): string | undefined {\n const overridden = new Set(overriddenMethods);\n const methods = crudMethods.filter((method) => !overridden.has(method));\n if (methods.length === 0) return undefined;\n if (\n methods.length === 6 &&\n methods.every(\n (method, index) => method === [...CRUD_OPERATIONS, 'search'][index],\n )\n ) {\n return `CrudOperations<${dataInterfaceName}>`;\n }\n return `Pick<CrudOperations<${dataInterfaceName}>, ${methods\n .map((method) => JSON.stringify(method))\n .join(' | ')}>`;\n}\n\nexport function renderApiClientCustomMethodParameters(\n method: ApiClientEntry['customMethods'][number],\n mapType: (type: string) => string,\n): string {\n const pathParamNames = new Set(method.pathParamNames);\n const params = method.parameters;\n const hasSingleOptionsParameter =\n params.length === 1 && params[0]?.name === 'options';\n const requiredPathProperties = method.pathParamNames\n .map((name) => `${name}: string`)\n .join('; ');\n let optionsType: string;\n\n if (hasSingleOptionsParameter) {\n const directOptionsType = mapType(params[0].type);\n optionsType = requiredPathProperties\n ? `${directOptionsType} & { ${requiredPathProperties} }`\n : directOptionsType;\n } else {\n const parameterNames = new Set(params.map((param) => param.name));\n const properties = params.map(\n (param) =>\n `${param.name}${pathParamNames.has(param.name) || !param.optional ? '' : '?'}: ${mapType(param.type)}`,\n );\n for (const pathParamName of method.pathParamNames) {\n if (!parameterNames.has(pathParamName)) {\n properties.push(`${pathParamName}: string`);\n }\n }\n optionsType =\n properties.length > 0\n ? `{ ${properties.join('; ')} }`\n : 'Record<string, never>';\n }\n\n const hasRequiredOptions = hasSingleOptionsParameter\n ? !params[0]?.optional\n : params.some(\n (param) => !pathParamNames.has(param.name) && !param.optional,\n );\n const optionsParameter = `${method.pathParamNames.length > 0 || hasRequiredOptions ? 'options' : 'options?'}: ${optionsType}`;\n return method.scope === 'collection'\n ? optionsParameter\n : `id: string, ${optionsParameter}`;\n}\n\ninterface ManifestCandidate {\n objectName: string;\n obj: SmartObjectDefinition;\n}\n\nfunction compareText(left: string, right: string): number {\n if (left < right) return -1;\n if (left > right) return 1;\n return 0;\n}\n\nfunction candidateIdentity(candidate: ManifestCandidate): string {\n return [\n candidate.obj.qualifiedName ?? '',\n candidate.obj.className,\n candidate.objectName,\n ].join('\\0');\n}\n\nfunction compareCandidateIdentity(\n left: ManifestCandidate,\n right: ManifestCandidate,\n): number {\n return compareText(candidateIdentity(left), candidateIdentity(right));\n}\n\nfunction lowerFirst(value: string): string {\n return value ? value[0].toLowerCase() + value.slice(1) : value;\n}\n\nfunction isAncestorOf(\n manifest: SmartObjectManifest,\n ancestor: SmartObjectDefinition,\n descendant: SmartObjectDefinition,\n): boolean {\n const seen = new Set<string>();\n let child = descendant;\n let parentName = child.extendsQualified || child.extends;\n\n while (parentName && !seen.has(parentName)) {\n seen.add(parentName);\n const parent = findManifestObjectByName(manifest, parentName, child);\n if (!parent) return false;\n if (parent === ancestor) return true;\n child = parent;\n parentName = parent.extendsQualified || parent.extends;\n }\n\n return false;\n}\n\nconst CRUD_OPERATION_SET = new Set<string>(CRUD_OPERATIONS);\n\nfunction resolveGeneratedClientCustomMethods(\n obj: SmartObjectDefinition,\n manifest: SmartObjectManifest,\n): ApiClientEntry['customMethods'] {\n const apiConfig = obj.decoratorConfig?.api;\n if (apiConfig === false) return [];\n\n const isCollection = isCollectionManifestClass(manifest, obj);\n const isModelClassName = createManifestClassNamePredicate(manifest);\n\n return Object.entries(obj.methods ?? {}).flatMap(([name, method]) => {\n // The client's whole contract is \"methods whose routes the server actually\n // emits\", so it reads the SAME resolver the emitters do rather than its own\n // include/exclude copy. Before #2686 that copy was equivalent; once the\n // wire-ability gate and `@method()` joined the decision, a local copy would\n // hand callers a typed `client.assets.createNewVersion(...)` pointing at a\n // route that is no longer written.\n if (\n !resolveApiMethodExposure({\n actionName: name,\n method,\n apiConfig,\n isCollectionClass: isCollection,\n ...(isModelClassName ? { isModelClassName } : {}),\n }).exposed\n ) {\n return [];\n }\n\n const routeConfig = resolveApiActionRouteConfig(\n name,\n method,\n apiConfig,\n {},\n isCollection ? 'collection' : method.isStatic ? 'collection' : 'item',\n );\n\n return [\n {\n name,\n scope: routeConfig.scope,\n pathParamNames: routeConfig.pathParamNames,\n parameters: method.parameters ?? [],\n },\n ];\n });\n}\n\nfunction resolveCrudObject(\n obj: SmartObjectDefinition,\n manifest: SmartObjectManifest,\n): SmartObjectDefinition | undefined {\n if (!isCollectionManifestClass(manifest, obj)) return obj;\n\n const itemObject = resolveCollectionItemObject(manifest, obj);\n if (itemObject) return itemObject;\n\n // A non-conventional collection can still share an endpoint with a model.\n // Iterating the deterministic qualified-identity order (#2754) gives this\n // fallback the same total tie-break as every other manifest consumer.\n return orderedManifestObjectEntries(manifest)\n .filter(\n ([, candidate]) =>\n candidate.collection === obj.collection &&\n !isCollectionManifestClass(manifest, candidate),\n )\n .map(([, candidate]) => candidate)[0];\n}\n\nfunction resolveGeneratedClientCrudMethods(\n obj: SmartObjectDefinition,\n manifest: SmartObjectManifest,\n): ApiClientCrudMethod[] {\n const crudObject = resolveCrudObject(obj, manifest);\n const apiConfig = crudObject?.decoratorConfig?.api;\n if (!crudObject || apiConfig === false) return [];\n\n if (apiConfig === true || apiConfig === undefined) {\n return [...CRUD_OPERATIONS, 'search'];\n }\n if (typeof apiConfig !== 'object' || apiConfig === null) {\n return [...CRUD_OPERATIONS, 'search'];\n }\n\n const included = Array.isArray(apiConfig.include)\n ? apiConfig.include\n : undefined;\n const excluded = Array.isArray(apiConfig.exclude) ? apiConfig.exclude : [];\n const standardMethods = (\n included\n ? CRUD_OPERATIONS.filter((action) => included.includes(action))\n : [...CRUD_OPERATIONS]\n ).filter((action) => !excluded.includes(action));\n\n // Preserve the historical search convenience only for an unbounded API\n // config. Explicit include lists are fail-closed; a real custom search\n // method is carried separately by resolveGeneratedClientCustomMethods().\n const includeSearch = !included && !excluded.includes('search');\n return includeSearch ? [...standardMethods, 'search'] : standardMethods;\n}\n\n/**\n * Resolve the CRUD surface that the generated route files actually expose for\n * one shared collection endpoint.\n *\n * Route generation processes manifest objects in the deterministic\n * qualified-identity order of {@link orderedManifestObjectEntries} (#2754):\n * collection and item handlers live in separate files, and the last model\n * that emits each file replaces the earlier file. Mirror that behavior here\n * by iterating the same order, so every client alias for a shared endpoint\n * has the same, real action set regardless of manifest scan order.\n */\nfunction resolveGeneratedEndpointCrudMethods(\n collection: string,\n manifest: SmartObjectManifest,\n): ApiClientCrudMethod[] {\n let collectionMethods: ApiClientCrudMethod[] = [];\n let itemMethods: ApiClientCrudMethod[] = [];\n\n for (const [, obj] of orderedManifestObjectEntries(manifest)) {\n if (\n obj.collection !== collection ||\n isCollectionManifestClass(manifest, obj)\n ) {\n continue;\n }\n\n const methods = resolveGeneratedClientCrudMethods(obj, manifest);\n const emittedCollectionMethods = methods.filter((method) =>\n ['list', 'create', 'search'].includes(method),\n );\n const emittedItemMethods = methods.filter((method) =>\n ['get', 'update', 'delete'].includes(method),\n );\n\n // generateRoutesForObject only writes a route file when that file has at\n // least one standard handler. A custom-only object leaves an earlier CRUD\n // file intact rather than replacing it with an empty file.\n if (\n emittedCollectionMethods.some(\n (method) => method === 'list' || method === 'create',\n )\n ) {\n collectionMethods = emittedCollectionMethods;\n }\n if (emittedItemMethods.length > 0) {\n itemMethods = emittedItemMethods;\n }\n }\n\n const emitted = new Set([...collectionMethods, ...itemMethods]);\n const orderedMethods: ApiClientCrudMethod[] = [...CRUD_OPERATIONS, 'search'];\n return orderedMethods.filter((method) => emitted.has(method));\n}\n\nfunction exposesApiClientSurface(\n obj: SmartObjectDefinition,\n manifest: SmartObjectManifest,\n): boolean {\n if (obj.decoratorConfig?.api === false) return false;\n if (resolveGeneratedClientCrudMethods(obj, manifest).length > 0) return true;\n\n // A disabled item has no CRUD routes. Keep its companion collection only\n // when the collection itself contributes a custom route that the SvelteKit\n // generator will actually emit.\n return resolveGeneratedClientCustomMethods(obj, manifest).length > 0;\n}\n\nfunction resolveDataInterfaceName(\n obj: SmartObjectDefinition,\n manifest: SmartObjectManifest,\n): string {\n if (!isCollectionManifestClass(manifest, obj)) {\n return `${obj.className}Data`;\n }\n\n const itemObject = resolveCollectionItemObject(manifest, obj);\n return `${itemObject?.className || obj.className}Data`;\n}\n\nfunction sharedCollectionModelDepth(\n manifest: SmartObjectManifest,\n obj: SmartObjectDefinition,\n): number {\n const seen = new Set<string>();\n let depth = 0;\n let child = obj;\n let parentName = child.extendsQualified || child.extends;\n\n while (parentName && !seen.has(parentName)) {\n seen.add(parentName);\n const parent = findManifestObjectByName(manifest, parentName, child);\n if (!parent || parent.collection !== obj.collection) break;\n depth += 1;\n child = parent;\n parentName = parent.extendsQualified || parent.extends;\n }\n\n return depth;\n}\n\n/**\n * Select the owner of one canonical collection endpoint with a transitive rank.\n *\n * Models beat collection classes because CRUD payloads are rows. Among models,\n * shallower same-collection ancestry wins, then a root with more descendants\n * wins (the STI base over an unrelated endpoint collision), then qualified\n * identity resolves any remaining ambiguity. Numeric/lexical tuple ranks stay\n * transitive, unlike pairwise ancestry overrides inside Array.sort().\n */\nfunction selectCanonicalOwner(\n manifest: SmartObjectManifest,\n group: ManifestCandidate[],\n): ManifestCandidate | undefined {\n const models = group.filter(\n (candidate) => !isCollectionManifestClass(manifest, candidate.obj),\n );\n\n if (models.length > 0) {\n return [...models]\n .map((candidate) => ({\n candidate,\n depth: sharedCollectionModelDepth(manifest, candidate.obj),\n descendantCount: models.filter(\n (other) =>\n other !== candidate &&\n isAncestorOf(manifest, candidate.obj, other.obj),\n ).length,\n }))\n .sort(\n (left, right) =>\n left.depth - right.depth ||\n right.descendantCount - left.descendantCount ||\n compareCandidateIdentity(left.candidate, right.candidate),\n )[0]?.candidate;\n }\n\n return [...group].sort((left, right) => {\n const leftHasItem = resolveCollectionItemObject(manifest, left.obj);\n const rightHasItem = resolveCollectionItemObject(manifest, right.obj);\n if (Boolean(leftHasItem) !== Boolean(rightHasItem)) {\n return leftHasItem ? -1 : 1;\n }\n return compareCandidateIdentity(left, right);\n })[0];\n}\n\n/**\n * Select every generated client entry with deterministic endpoint keys and row\n * payload types. Exactly one entry owns each canonical collection key; other\n * API objects remain available under stable class-derived secondary keys.\n */\nexport function selectApiClientEntries(\n manifest: SmartObjectManifest,\n): ApiClientEntry[] {\n const candidates = Object.entries(manifest.objects)\n .filter(([, obj]) => exposesApiClientSurface(obj, manifest))\n .map(([objectName, obj]): ManifestCandidate => ({ objectName, obj }));\n const candidatesByCollection = new Map<string, ManifestCandidate[]>();\n\n for (const candidate of candidates) {\n const group = candidatesByCollection.get(candidate.obj.collection) ?? [];\n group.push(candidate);\n candidatesByCollection.set(candidate.obj.collection, group);\n }\n\n const canonicalOwners = new Map<string, ManifestCandidate>();\n for (const [collection, group] of candidatesByCollection) {\n const canonicalOwner = selectCanonicalOwner(manifest, group);\n if (canonicalOwner) canonicalOwners.set(collection, canonicalOwner);\n }\n\n // Canonical owners are emitted first within each collection. Sorting all\n // remaining candidates by identity makes numeric suffixes stable too.\n const orderedCandidates = [...candidates].sort((left, right) => {\n const collectionOrder = compareText(\n left.obj.collection,\n right.obj.collection,\n );\n if (collectionOrder !== 0) return collectionOrder;\n\n const leftIsCanonical = canonicalOwners.get(left.obj.collection) === left;\n const rightIsCanonical =\n canonicalOwners.get(right.obj.collection) === right;\n if (leftIsCanonical !== rightIsCanonical) {\n return leftIsCanonical ? -1 : 1;\n }\n\n return compareCandidateIdentity(left, right);\n });\n\n // A secondary key must never shadow any canonical endpoint, including a\n // later collection whose canonical owner has not been emitted yet.\n const reservedCanonicalKeys = new Set(canonicalOwners.keys());\n const usedKeys = new Set<string>();\n\n return orderedCandidates.map(({ objectName, obj }) => {\n const isCanonicalOwner =\n canonicalOwners.get(obj.collection)?.objectName === objectName;\n let clientKey = isCanonicalOwner\n ? obj.collection\n : lowerFirst(obj.className);\n const baseClientKey = clientKey;\n let suffix = 2;\n\n while (\n usedKeys.has(clientKey) ||\n (!isCanonicalOwner && reservedCanonicalKeys.has(clientKey))\n ) {\n clientKey = `${baseClientKey}${suffix}`;\n suffix += 1;\n }\n\n usedKeys.add(clientKey);\n return {\n objectName,\n obj,\n clientKey,\n dataInterfaceName: resolveDataInterfaceName(obj, manifest),\n crudMethods: resolveGeneratedEndpointCrudMethods(\n obj.collection,\n manifest,\n ),\n customMethods: resolveGeneratedClientCustomMethods(obj, manifest),\n };\n });\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"api-client-entries.js","names":[],"sources":["../../src/vite-plugin/api-client-entries.ts"],"sourcesContent":["/**\n * Manifest -> generated API-client entry selection.\n *\n * Runtime client values, Vite ambient declarations, and physical prebuild\n * declarations must agree on which manifest object owns a collection's\n * canonical endpoint. Collection classes describe access methods, not row\n * payloads, so a populated model always wins the shared collection key.\n */\n\nimport {\n CRUD_OPERATIONS,\n createManifestClassNamePredicate,\n resolveApiMethodExposure,\n} from '../generators/custom-action.js';\nimport type {\n SmartObjectDefinition,\n SmartObjectManifest,\n} from '../scanner/types.js';\nimport { resolveApiActionRouteConfig } from './sveltekit-generator.js';\nimport {\n findManifestObjectByName,\n isCollectionManifestClass,\n orderedManifestObjectEntries,\n resolveCollectionItemObject,\n} from './web-collections.js';\n\nexport type ApiClientCrudMethod =\n | 'list'\n | 'get'\n | 'create'\n | 'update'\n | 'delete'\n | 'search';\n\nexport interface ApiClientEntry {\n /** Original key in manifest.objects. */\n objectName: string;\n /** Object whose routes and custom methods this client entry exposes. */\n obj: SmartObjectDefinition;\n /** Canonical collection key or deterministic class-derived secondary key. */\n clientKey: string;\n /** Row-payload interface used by CRUD methods for this entry. */\n dataInterfaceName: string;\n /** Standard client operations whose server routes are actually emitted. */\n crudMethods: ApiClientCrudMethod[];\n /** Custom methods whose routes are actually emitted by the server. */\n customMethods: Array<{\n name: string;\n scope: 'item' | 'collection';\n pathParamNames: string[];\n parameters: Array<{\n name: string;\n type: string;\n optional?: boolean;\n default?: unknown;\n }>;\n }>;\n}\n\nexport function renderApiClientCrudType(\n dataInterfaceName: string,\n crudMethods: ApiClientCrudMethod[],\n overriddenMethods: string[] = [],\n): string | undefined {\n const overridden = new Set(overriddenMethods);\n const methods = crudMethods.filter((method) => !overridden.has(method));\n if (methods.length === 0) return undefined;\n if (\n methods.length === 6 &&\n methods.every(\n (method, index) => method === [...CRUD_OPERATIONS, 'search'][index],\n )\n ) {\n return `CrudOperations<${dataInterfaceName}>`;\n }\n return `Pick<CrudOperations<${dataInterfaceName}>, ${methods\n .map((method) => JSON.stringify(method))\n .join(' | ')}>`;\n}\n\nexport function renderApiClientCustomMethodParameters(\n method: ApiClientEntry['customMethods'][number],\n mapType: (type: string) => string,\n): string {\n const pathParamNames = new Set(method.pathParamNames);\n const params = method.parameters;\n const hasSingleOptionsParameter =\n params.length === 1 && params[0]?.name === 'options';\n const requiredPathProperties = method.pathParamNames\n .map((name) => `${name}: string`)\n .join('; ');\n let optionsType: string;\n\n if (hasSingleOptionsParameter) {\n const directOptionsType = mapType(params[0].type);\n optionsType = requiredPathProperties\n ? `${directOptionsType} & { ${requiredPathProperties} }`\n : directOptionsType;\n } else {\n const parameterNames = new Set(params.map((param) => param.name));\n const properties = params.map(\n (param) =>\n `${param.name}${pathParamNames.has(param.name) || !param.optional ? '' : '?'}: ${mapType(param.type)}`,\n );\n for (const pathParamName of method.pathParamNames) {\n if (!parameterNames.has(pathParamName)) {\n properties.push(`${pathParamName}: string`);\n }\n }\n optionsType =\n properties.length > 0\n ? `{ ${properties.join('; ')} }`\n : 'Record<string, never>';\n }\n\n const hasRequiredOptions = hasSingleOptionsParameter\n ? !params[0]?.optional\n : params.some(\n (param) => !pathParamNames.has(param.name) && !param.optional,\n );\n const optionsParameter = `${method.pathParamNames.length > 0 || hasRequiredOptions ? 'options' : 'options?'}: ${optionsType}`;\n return method.scope === 'collection'\n ? optionsParameter\n : `id: string, ${optionsParameter}`;\n}\n\ninterface ManifestCandidate {\n objectName: string;\n obj: SmartObjectDefinition;\n}\n\nfunction compareText(left: string, right: string): number {\n if (left < right) return -1;\n if (left > right) return 1;\n return 0;\n}\n\nfunction candidateIdentity(candidate: ManifestCandidate): string {\n return [\n candidate.obj.qualifiedName ?? '',\n candidate.obj.className,\n candidate.objectName,\n ].join('\\0');\n}\n\nfunction compareCandidateIdentity(\n left: ManifestCandidate,\n right: ManifestCandidate,\n): number {\n return compareText(candidateIdentity(left), candidateIdentity(right));\n}\n\nfunction lowerFirst(value: string): string {\n return value ? value[0].toLowerCase() + value.slice(1) : value;\n}\n\nfunction isAncestorOf(\n manifest: SmartObjectManifest,\n ancestor: SmartObjectDefinition,\n descendant: SmartObjectDefinition,\n): boolean {\n const seen = new Set<string>();\n let child = descendant;\n let parentName = child.extendsQualified || child.extends;\n\n while (parentName && !seen.has(parentName)) {\n seen.add(parentName);\n const parent = findManifestObjectByName(manifest, parentName, child);\n if (!parent) return false;\n if (parent === ancestor) return true;\n child = parent;\n parentName = parent.extendsQualified || parent.extends;\n }\n\n return false;\n}\n\nconst CRUD_OPERATION_SET = new Set<string>(CRUD_OPERATIONS);\n\nfunction resolveGeneratedClientCustomMethods(\n obj: SmartObjectDefinition,\n manifest: SmartObjectManifest,\n): ApiClientEntry['customMethods'] {\n const apiConfig = obj.decoratorConfig?.api;\n if (apiConfig === false) return [];\n\n const isCollection = isCollectionManifestClass(manifest, obj);\n if (\n isCollection &&\n resolveCollectionItemObject(manifest, obj)?.decoratorConfig?.abstract ===\n true\n ) {\n return [];\n }\n const isModelClassName = createManifestClassNamePredicate(manifest);\n\n return Object.entries(obj.methods ?? {}).flatMap(([name, method]) => {\n // The client's whole contract is \"methods whose routes the server actually\n // emits\", so it reads the SAME resolver the emitters do rather than its own\n // include/exclude copy. Before #2686 that copy was equivalent; once the\n // wire-ability gate and `@method()` joined the decision, a local copy would\n // hand callers a typed `client.assets.createNewVersion(...)` pointing at a\n // route that is no longer written.\n if (\n !resolveApiMethodExposure({\n actionName: name,\n method,\n apiConfig,\n isCollectionClass: isCollection,\n ...(isModelClassName ? { isModelClassName } : {}),\n }).exposed\n ) {\n return [];\n }\n\n const routeConfig = resolveApiActionRouteConfig(\n name,\n method,\n apiConfig,\n {},\n isCollection ? 'collection' : method.isStatic ? 'collection' : 'item',\n );\n\n return [\n {\n name,\n scope: routeConfig.scope,\n pathParamNames: routeConfig.pathParamNames,\n parameters: method.parameters ?? [],\n },\n ];\n });\n}\n\nfunction resolveCrudObject(\n obj: SmartObjectDefinition,\n manifest: SmartObjectManifest,\n): SmartObjectDefinition | undefined {\n if (!isCollectionManifestClass(manifest, obj)) return obj;\n\n const itemObject = resolveCollectionItemObject(manifest, obj);\n if (itemObject) return itemObject;\n\n // A non-conventional collection can still share an endpoint with a model.\n // Iterating the deterministic qualified-identity order (#2754) gives this\n // fallback the same total tie-break as every other manifest consumer.\n return orderedManifestObjectEntries(manifest)\n .filter(\n ([, candidate]) =>\n candidate.collection === obj.collection &&\n !isCollectionManifestClass(manifest, candidate),\n )\n .map(([, candidate]) => candidate)[0];\n}\n\nfunction resolveGeneratedClientCrudMethods(\n obj: SmartObjectDefinition,\n manifest: SmartObjectManifest,\n): ApiClientCrudMethod[] {\n const crudObject = resolveCrudObject(obj, manifest);\n const apiConfig = crudObject?.decoratorConfig?.api;\n if (!crudObject || apiConfig === false) return [];\n\n if (apiConfig === true || apiConfig === undefined) {\n return [...CRUD_OPERATIONS, 'search'];\n }\n if (typeof apiConfig !== 'object' || apiConfig === null) {\n return [...CRUD_OPERATIONS, 'search'];\n }\n\n const included = Array.isArray(apiConfig.include)\n ? apiConfig.include\n : undefined;\n const excluded = Array.isArray(apiConfig.exclude) ? apiConfig.exclude : [];\n const standardMethods = (\n included\n ? CRUD_OPERATIONS.filter((action) => included.includes(action))\n : [...CRUD_OPERATIONS]\n ).filter((action) => !excluded.includes(action));\n\n // Preserve the historical search convenience only for an unbounded API\n // config. Explicit include lists are fail-closed; a real custom search\n // method is carried separately by resolveGeneratedClientCustomMethods().\n const includeSearch = !included && !excluded.includes('search');\n return includeSearch ? [...standardMethods, 'search'] : standardMethods;\n}\n\n/**\n * Resolve the CRUD surface that the generated route files actually expose for\n * one shared collection endpoint.\n *\n * Route generation processes manifest objects in the deterministic\n * qualified-identity order of {@link orderedManifestObjectEntries} (#2754):\n * collection and item handlers live in separate files, and the last model\n * that emits each file replaces the earlier file. Mirror that behavior here\n * by iterating the same order, so every client alias for a shared endpoint\n * has the same, real action set regardless of manifest scan order.\n */\nfunction resolveGeneratedEndpointCrudMethods(\n collection: string,\n manifest: SmartObjectManifest,\n): ApiClientCrudMethod[] {\n let collectionMethods: ApiClientCrudMethod[] = [];\n let itemMethods: ApiClientCrudMethod[] = [];\n\n for (const [, obj] of orderedManifestObjectEntries(manifest)) {\n if (\n obj.collection !== collection ||\n isCollectionManifestClass(manifest, obj)\n ) {\n continue;\n }\n\n const methods = resolveGeneratedClientCrudMethods(obj, manifest);\n const emittedCollectionMethods = methods.filter((method) =>\n ['list', 'create', 'search'].includes(method),\n );\n const emittedItemMethods = methods.filter((method) =>\n ['get', 'update', 'delete'].includes(method),\n );\n\n // generateRoutesForObject only writes a route file when that file has at\n // least one standard handler. A custom-only object leaves an earlier CRUD\n // file intact rather than replacing it with an empty file.\n if (\n emittedCollectionMethods.some(\n (method) => method === 'list' || method === 'create',\n )\n ) {\n collectionMethods = emittedCollectionMethods;\n }\n if (emittedItemMethods.length > 0) {\n itemMethods = emittedItemMethods;\n }\n }\n\n const emitted = new Set([...collectionMethods, ...itemMethods]);\n const orderedMethods: ApiClientCrudMethod[] = [...CRUD_OPERATIONS, 'search'];\n return orderedMethods.filter((method) => emitted.has(method));\n}\n\nfunction exposesApiClientSurface(\n obj: SmartObjectDefinition,\n manifest: SmartObjectManifest,\n): boolean {\n if (obj.decoratorConfig?.api === false) return false;\n if (resolveGeneratedClientCrudMethods(obj, manifest).length > 0) return true;\n\n // A disabled item has no CRUD routes. Keep its companion collection only\n // when the collection itself contributes a custom route that the SvelteKit\n // generator will actually emit.\n return resolveGeneratedClientCustomMethods(obj, manifest).length > 0;\n}\n\nfunction resolveDataInterfaceName(\n obj: SmartObjectDefinition,\n manifest: SmartObjectManifest,\n): string {\n if (!isCollectionManifestClass(manifest, obj)) {\n return `${obj.className}Data`;\n }\n\n const itemObject = resolveCollectionItemObject(manifest, obj);\n return `${itemObject?.className || obj.className}Data`;\n}\n\nfunction sharedCollectionModelDepth(\n manifest: SmartObjectManifest,\n obj: SmartObjectDefinition,\n): number {\n const seen = new Set<string>();\n let depth = 0;\n let child = obj;\n let parentName = child.extendsQualified || child.extends;\n\n while (parentName && !seen.has(parentName)) {\n seen.add(parentName);\n const parent = findManifestObjectByName(manifest, parentName, child);\n if (!parent || parent.collection !== obj.collection) break;\n depth += 1;\n child = parent;\n parentName = parent.extendsQualified || parent.extends;\n }\n\n return depth;\n}\n\n/**\n * Select the owner of one canonical collection endpoint with a transitive rank.\n *\n * Models beat collection classes because CRUD payloads are rows. Among models,\n * shallower same-collection ancestry wins, then a root with more descendants\n * wins (the STI base over an unrelated endpoint collision), then qualified\n * identity resolves any remaining ambiguity. Numeric/lexical tuple ranks stay\n * transitive, unlike pairwise ancestry overrides inside Array.sort().\n */\nfunction selectCanonicalOwner(\n manifest: SmartObjectManifest,\n group: ManifestCandidate[],\n): ManifestCandidate | undefined {\n const models = group.filter(\n (candidate) => !isCollectionManifestClass(manifest, candidate.obj),\n );\n\n if (models.length > 0) {\n return [...models]\n .map((candidate) => ({\n candidate,\n depth: sharedCollectionModelDepth(manifest, candidate.obj),\n descendantCount: models.filter(\n (other) =>\n other !== candidate &&\n isAncestorOf(manifest, candidate.obj, other.obj),\n ).length,\n }))\n .sort(\n (left, right) =>\n left.depth - right.depth ||\n right.descendantCount - left.descendantCount ||\n compareCandidateIdentity(left.candidate, right.candidate),\n )[0]?.candidate;\n }\n\n return [...group].sort((left, right) => {\n const leftHasItem = resolveCollectionItemObject(manifest, left.obj);\n const rightHasItem = resolveCollectionItemObject(manifest, right.obj);\n if (Boolean(leftHasItem) !== Boolean(rightHasItem)) {\n return leftHasItem ? -1 : 1;\n }\n return compareCandidateIdentity(left, right);\n })[0];\n}\n\n/**\n * Select every generated client entry with deterministic endpoint keys and row\n * payload types. Exactly one entry owns each canonical collection key; other\n * API objects remain available under stable class-derived secondary keys.\n */\nexport function selectApiClientEntries(\n manifest: SmartObjectManifest,\n): ApiClientEntry[] {\n const candidates = Object.entries(manifest.objects)\n .filter(([, obj]) => exposesApiClientSurface(obj, manifest))\n .map(([objectName, obj]): ManifestCandidate => ({ objectName, obj }));\n const candidatesByCollection = new Map<string, ManifestCandidate[]>();\n\n for (const candidate of candidates) {\n const group = candidatesByCollection.get(candidate.obj.collection) ?? [];\n group.push(candidate);\n candidatesByCollection.set(candidate.obj.collection, group);\n }\n\n const canonicalOwners = new Map<string, ManifestCandidate>();\n for (const [collection, group] of candidatesByCollection) {\n const canonicalOwner = selectCanonicalOwner(manifest, group);\n if (canonicalOwner) canonicalOwners.set(collection, canonicalOwner);\n }\n\n // Canonical owners are emitted first within each collection. Sorting all\n // remaining candidates by identity makes numeric suffixes stable too.\n const orderedCandidates = [...candidates].sort((left, right) => {\n const collectionOrder = compareText(\n left.obj.collection,\n right.obj.collection,\n );\n if (collectionOrder !== 0) return collectionOrder;\n\n const leftIsCanonical = canonicalOwners.get(left.obj.collection) === left;\n const rightIsCanonical =\n canonicalOwners.get(right.obj.collection) === right;\n if (leftIsCanonical !== rightIsCanonical) {\n return leftIsCanonical ? -1 : 1;\n }\n\n return compareCandidateIdentity(left, right);\n });\n\n // A secondary key must never shadow any canonical endpoint, including a\n // later collection whose canonical owner has not been emitted yet.\n const reservedCanonicalKeys = new Set(canonicalOwners.keys());\n const usedKeys = new Set<string>();\n\n return orderedCandidates.map(({ objectName, obj }) => {\n const isCanonicalOwner =\n canonicalOwners.get(obj.collection)?.objectName === objectName;\n let clientKey = isCanonicalOwner\n ? obj.collection\n : lowerFirst(obj.className);\n const baseClientKey = clientKey;\n let suffix = 2;\n\n while (\n usedKeys.has(clientKey) ||\n (!isCanonicalOwner && reservedCanonicalKeys.has(clientKey))\n ) {\n clientKey = `${baseClientKey}${suffix}`;\n suffix += 1;\n }\n\n usedKeys.add(clientKey);\n return {\n objectName,\n obj,\n clientKey,\n dataInterfaceName: resolveDataInterfaceName(obj, manifest),\n crudMethods: resolveGeneratedEndpointCrudMethods(\n obj.collection,\n manifest,\n ),\n customMethods: resolveGeneratedClientCustomMethods(obj, manifest),\n };\n });\n}\n"],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/vite-plugin/index.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/vite-plugin/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -1287,6 +1287,7 @@ declare module '@happyvertical/smrt-virt-web' {
|
|
|
1287
1287
|
order?: number;
|
|
1288
1288
|
locked?: boolean;
|
|
1289
1289
|
widget?: 'textarea' | 'currency' | 'email' | 'url' | 'phone';
|
|
1290
|
+
format?: 'money' | 'date' | 'datetime' | 'percent';
|
|
1290
1291
|
}
|
|
1291
1292
|
|
|
1292
1293
|
export interface SmrtWebFieldDefinition {
|
|
@@ -1315,6 +1316,7 @@ declare module '@happyvertical/smrt-virt-web' {
|
|
|
1315
1316
|
field: string;
|
|
1316
1317
|
kind: SmrtWebRelationshipKind;
|
|
1317
1318
|
relatedCollection: string;
|
|
1319
|
+
role?: 'items';
|
|
1318
1320
|
}
|
|
1319
1321
|
|
|
1320
1322
|
export interface WebToolRouteDescriptor {
|