@fmaplabs/meta-manifest 0.1.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.
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/cli/index.ts","../../src/sync/client.ts","../../src/config.ts","../../src/node/client.ts","../../src/cli/load-config.ts","../../src/cli/init.ts","../../src/codegen.ts","../../src/sync/diff.ts","../../src/sync/normalize.ts","../../src/sync/pull.ts","../../src/sync/push.ts","../../src/cli/plan.ts","../../src/cli/format.ts","../../src/cli/diff.ts","../../src/cli/push.ts","../../src/cli/pull.ts"],"sourcesContent":["#!/usr/bin/env node\nimport { SyncTransportError } from \"../sync/client\";\nimport { createAdminClient } from \"../node/client\";\nimport { loadConfig, loadSchemas } from \"./load-config\";\nimport { runInit } from \"./init\";\nimport { runDiff } from \"./diff\";\nimport { runPush } from \"./push\";\nimport { runPull } from \"./pull\";\n\nexport interface Args {\n command?: string;\n config?: string;\n allowDestructive: boolean;\n force: boolean;\n help: boolean;\n}\n\nexport function parseArgs(argv: string[]): Args {\n const args: Args = { allowDestructive: false, force: false, help: false };\n for (let i = 0; i < argv.length; i++) {\n const a = argv[i];\n if (a === \"--help\" || a === \"-h\") args.help = true;\n else if (a === \"--allow-destructive\") args.allowDestructive = true;\n else if (a === \"--force\") args.force = true;\n else if (a === \"--config\") args.config = argv[++i];\n else if (!a.startsWith(\"-\") && !args.command) args.command = a;\n }\n return args;\n}\n\nconst HELP = `meta-manifest — sync Shopify metaobject definitions\n\nUsage: mm <command> [options]\n\nCommands:\n init Scaffold meta-manifest.config.ts + src/schema.ts\n pull Enumerate remote definitions and write schema source\n diff Show the changes a push would apply\n push Apply local schema to the store\n\nOptions:\n --config <path> Config file (default: meta-manifest.config.ts)\n --allow-destructive Apply destructive changes on push\n --force Overwrite schema on pull without warning\n -h, --help Show this help`;\n\nexport async function main(argv: string[]): Promise<number> {\n const args = parseArgs(argv);\n if (args.help || !args.command) {\n console.log(HELP);\n return args.command ? 0 : args.help ? 0 : 1;\n }\n try {\n if (args.command === \"init\") {\n await runInit();\n return 0;\n }\n const config = await loadConfig(args.config);\n const client = createAdminClient(config);\n if (args.command === \"pull\") {\n await runPull({ client, schemaPath: config.schema, force: args.force });\n return 0;\n }\n const schemas = await loadSchemas(config.schema);\n if (args.command === \"diff\") {\n await runDiff({ client, schemas });\n return 0;\n }\n if (args.command === \"push\") {\n const result = await runPush({ client, schemas, allowDestructive: args.allowDestructive });\n return result.ok ? 0 : 2;\n }\n console.error(`Unknown command: ${args.command}`);\n console.log(HELP);\n return 1;\n } catch (err) {\n if (err instanceof SyncTransportError) console.error(`Sync failed: Shopify rejected a request.`);\n else console.error(err instanceof Error ? err.message : String(err));\n return 1;\n }\n}\n\n// Invoked as the bin. Guarded so importing this module in tests (which read\n// `parseArgs`) does not trigger process.exit — vitest sets process.env.VITEST.\nif (process.env.VITEST === undefined) {\n main(process.argv.slice(2)).then((code) => process.exit(code));\n}\n","/**\n * The minimal Admin GraphQL transport the sync adapter depends on. The app\n * supplies a concrete implementation at its edge (wrapping `admin.graphql`),\n * keeping `@fmaplabs/meta-manifest` free of any runtime dependency on a GraphQL\n * client. [design §5]\n */\nexport interface AdminGraphQLClient {\n (query: string, options?: { variables?: Record<string, unknown> }): Promise<{ data?: unknown; errors?: unknown }>;\n}\n\n// GraphQL operation strings, copied verbatim from the schema-validated documents\n// in the design spec §3. Re-validated against Admin API 2026-07 during planning.\n// Do not edit by hand — keep equal to the validated documents (drift guard, §12).\n\nexport const PULL_DEFINITION_QUERY = `query PullMetaobjectDefinition($type: String!) {\n metaobjectDefinitionByType(type: $type) {\n id\n name\n type\n description\n displayNameKey\n fieldDefinitions {\n key\n name\n description\n required\n type { name }\n validations { name value }\n }\n access { admin storefront }\n capabilities {\n publishable { enabled }\n translatable { enabled }\n renderable { enabled }\n }\n }\n}`;\n\nexport const LIST_DEFINITIONS_QUERY = `query ListMetaobjectDefinitions($after: String) {\n metaobjectDefinitions(first: 50, after: $after) {\n nodes {\n id\n name\n type\n fieldDefinitions {\n key\n name\n description\n required\n type { name }\n validations { name value }\n }\n }\n pageInfo { hasNextPage endCursor }\n }\n}`;\n\nexport const CREATE_DEFINITION_MUTATION = `mutation CreateMetaobjectDefinition($definition: MetaobjectDefinitionCreateInput!) {\n metaobjectDefinitionCreate(definition: $definition) {\n metaobjectDefinition { id type }\n userErrors { field message code }\n }\n}`;\n\nexport const UPDATE_DEFINITION_MUTATION = `mutation UpdateMetaobjectDefinition($id: ID!, $definition: MetaobjectDefinitionUpdateInput!) {\n metaobjectDefinitionUpdate(id: $id, definition: $definition) {\n metaobjectDefinition { id type }\n userErrors { field message code }\n }\n}`;\n\n/**\n * Thrown when a request fails at the transport or top-level GraphQL layer —\n * distinct from per-op `userErrors`, which `push` reports as `failed` rather\n * than throwing. Carries the offending top-level `errors` payload. [design §5]\n */\nexport class SyncTransportError extends Error {\n constructor(message: string, readonly errors: unknown) {\n super(message);\n this.name = \"SyncTransportError\";\n }\n}\n\n/**\n * Runs an operation through the injected client and returns its `data`.\n * A non-empty top-level `errors` payload becomes a `SyncTransportError`;\n * a rejected transport promise propagates unchanged. [design §5]\n */\nexport async function execute<T>(\n client: AdminGraphQLClient,\n query: string,\n variables?: Record<string, unknown>,\n): Promise<T> {\n const result = await client(query, variables ? { variables } : undefined);\n if (Array.isArray(result.errors) ? result.errors.length > 0 : result.errors != null) {\n throw new SyncTransportError(\"GraphQL request failed\", result.errors);\n }\n return result.data as T;\n}\n","export const DEFAULT_API_VERSION = \"2026-07\";\n\nexport interface Config {\n /** e.g. \"my-store.myshopify.com\" */\n shop: string;\n /** Admin API access token; reference via process.env in your config file. */\n accessToken: string;\n /** Admin API version. Defaults to DEFAULT_API_VERSION. */\n apiVersion?: string;\n /** Path to the schema module whose `schemas` export drives diff/push, and pull writes. */\n schema: string;\n}\n\n/** Identity helper for type inference in `meta-manifest.config.ts`. */\nexport function defineConfig(config: Config): Config {\n return config;\n}\n\n/** Validate a loaded config object, throwing a one-line Error naming the first missing field. */\nexport function validateConfig(raw: unknown): Config {\n const c = raw as Partial<Config> | null | undefined;\n for (const key of [\"shop\", \"accessToken\", \"schema\"] as const) {\n if (!c || typeof c[key] !== \"string\" || c[key] === \"\") {\n throw new Error(`Invalid config: missing or empty \"${key}\".`);\n }\n }\n return c as Config;\n}\n","import type { AdminGraphQLClient } from \"../sync/client\";\nimport { SyncTransportError } from \"../sync/client\";\nimport { DEFAULT_API_VERSION } from \"../config\";\n\n/**\n * Build an AdminGraphQLClient that talks directly to a store using an Admin API\n * access token — the CLI's standalone equivalent of the app's session-based\n * `admin.graphql` wrapper. [design §2]\n */\nexport function createAdminClient(opts: {\n shop: string;\n accessToken: string;\n apiVersion?: string;\n}): AdminGraphQLClient {\n const version = opts.apiVersion ?? DEFAULT_API_VERSION;\n const endpoint = `https://${opts.shop}/admin/api/${version}/graphql.json`;\n return async (query, options) => {\n let res: Response;\n try {\n res = await fetch(endpoint, {\n method: \"POST\",\n headers: { \"Content-Type\": \"application/json\", \"X-Shopify-Access-Token\": opts.accessToken },\n body: JSON.stringify({ query, variables: options?.variables }),\n });\n } catch (cause) {\n throw new SyncTransportError(`Request to ${opts.shop} failed`, cause);\n }\n if (!res.ok) {\n throw new SyncTransportError(`Admin API returned HTTP ${res.status}`, await res.text().catch(() => null));\n }\n return res.json() as Promise<{ data?: unknown; errors?: unknown }>;\n };\n}\n","import { resolve } from \"node:path\";\nimport { createJiti } from \"jiti\";\nimport { validateConfig } from \"../config\";\nimport type { Config } from \"../config\";\nimport type { AnySchema } from \"../index\";\n\nconst jiti = createJiti(import.meta.url);\n\n/** Load and validate meta-manifest.config.ts (default: ./meta-manifest.config.ts). */\nexport async function loadConfig(configPath = \"meta-manifest.config.ts\"): Promise<Config> {\n const abs = resolve(process.cwd(), configPath);\n const mod = await jiti.import<{ default?: unknown }>(abs);\n return validateConfig(mod.default);\n}\n\n/** Load the `schemas` export from a schema module. */\nexport async function loadSchemas(schemaPath: string): Promise<AnySchema[]> {\n const abs = resolve(process.cwd(), schemaPath);\n const mod = await jiti.import<{ schemas?: unknown }>(abs);\n if (!Array.isArray(mod.schemas)) {\n throw new Error(`Schema module \"${schemaPath}\" must export a \\`schemas\\` array.`);\n }\n return mod.schemas as AnySchema[];\n}\n","import { existsSync, mkdirSync, writeFileSync } from \"node:fs\";\nimport { dirname, join } from \"node:path\";\n\nconst CONFIG_TEMPLATE = `import { defineConfig } from \"@fmaplabs/meta-manifest\";\n\nexport default defineConfig({\n shop: \"my-store.myshopify.com\",\n accessToken: process.env.SHOPIFY_ADMIN_TOKEN!,\n schema: \"./src/schema.ts\",\n});\n`;\n\nconst SCHEMA_TEMPLATE = `import { defineMetaobject, m } from \"@fmaplabs/meta-manifest\";\n\nexport const Author = defineMetaobject(\"author\", {\n name: \"Author\",\n fields: {\n name: m.text({ required: true, max: 120 }),\n bio: m.multilineText(),\n },\n});\n\nexport const schemas = [Author];\n`;\n\n/** Scaffold config + schema files, never overwriting existing ones. */\nexport async function runInit(opts: { cwd?: string } = {}): Promise<{ created: string[] }> {\n const cwd = opts.cwd ?? process.cwd();\n const created: string[] = [];\n const write = (rel: string, contents: string) => {\n const abs = join(cwd, rel);\n if (existsSync(abs)) return;\n mkdirSync(dirname(abs), { recursive: true });\n writeFileSync(abs, contents);\n created.push(rel);\n };\n write(\"meta-manifest.config.ts\", CONFIG_TEMPLATE);\n write(\"src/schema.ts\", SCHEMA_TEMPLATE);\n if (created.length) {\n console.log(`Created: ${created.join(\", \")}`);\n console.log(\"Next: set SHOPIFY_ADMIN_TOKEN in your env, edit meta-manifest.config.ts, then run `mm diff`.\");\n } else {\n console.log(\"Nothing to do — config and schema already exist.\");\n }\n return { created };\n}\n","import type { RemoteDefinition, RemoteField } from \"./sync/normalize\";\nimport type { FieldValidation } from \"./fields/base\";\n\nconst APP_PREFIX = \"$app:\";\n\n/** Shopify scalar/reference type → m.* builder name (no special construction). */\nconst SIMPLE: Record<string, string> = {\n single_line_text_field: \"text\",\n multi_line_text_field: \"multilineText\",\n number_integer: \"integer\",\n number_decimal: \"decimal\",\n boolean: \"boolean\",\n date: \"date\",\n date_time: \"dateTime\",\n url: \"url\",\n color: \"color\",\n json: \"json\",\n money: \"money\",\n dimension: \"dimension\",\n weight: \"weight\",\n volume: \"volume\",\n product_reference: \"product\",\n variant_reference: \"variant\",\n collection_reference: \"collection\",\n page_reference: \"page\",\n file_reference: \"file\",\n};\n\nfunction handleOf(type: string): string {\n return type.startsWith(APP_PREFIX) ? type.slice(APP_PREFIX.length) : type;\n}\n\nfunction identOf(type: string): string {\n return handleOf(type)\n .split(/[^a-zA-Z0-9]+/)\n .filter(Boolean)\n .map((p) => p[0].toUpperCase() + p.slice(1))\n .join(\"\");\n}\n\nfunction v(validations: FieldValidation[], name: string): string | undefined {\n return validations.find((x) => x.name === name)?.value;\n}\n\n/** Reference target ($app: type) from a metaobject_reference field's validations. */\nfunction refTarget(field: RemoteField): string | undefined {\n const single = v(field.validations, \"metaobject_definition_type\");\n if (single) return single;\n const many = v(field.validations, \"metaobject_definition_types\");\n if (many) {\n try {\n const arr = JSON.parse(many);\n if (Array.isArray(arr) && arr.length) return String(arr[0]);\n } catch {\n /* fall through */\n }\n }\n return undefined;\n}\n\n/** Build the options-object literal source (e.g. `{ required: true, max: 120 }`), or \"\". */\nfunction optsLiteral(entries: string[]): string {\n return entries.length ? `{ ${entries.join(\", \")} }` : \"\";\n}\n\n/** Number/string/JSON-array validation → option entries for scalar builders. */\nfunction scalarEntries(field: RemoteField, warnings: string[], builder: string): string[] {\n const e: string[] = [];\n if (field.required) e.push(\"required: true\");\n const num = (name: string, opt: string) => {\n const val = v(field.validations, name);\n if (val !== undefined) e.push(`${opt}: ${Number(val)}`);\n };\n const str = (name: string, opt: string) => {\n const val = v(field.validations, name);\n if (val !== undefined) e.push(`${opt}: ${JSON.stringify(val)}`);\n };\n const jsonArr = (name: string, opt: string) => {\n const val = v(field.validations, name);\n if (val !== undefined) {\n try {\n e.push(`${opt}: ${JSON.stringify(JSON.parse(val))}`);\n } catch {\n warnings.push(`could not parse \"${name}\" on field \"${field.key}\"`);\n }\n }\n };\n // `date`/`date_time` store min/max as ISO date strings, not numbers — emit them as\n // quoted string literals so they round-trip (Number(\"2020-01-01\") is NaN).\n if (builder === \"date\" || builder === \"dateTime\") {\n str(\"min\", \"min\");\n str(\"max\", \"max\");\n } else {\n num(\"min\", \"min\");\n num(\"max\", \"max\");\n }\n str(\"regex\", \"regex\");\n jsonArr(\"choices\", \"choices\");\n num(\"max_precision\", \"maxPrecision\");\n jsonArr(\"allowed_domains\", \"allowedDomains\");\n jsonArr(\"file_type_options\", \"accept\");\n return e;\n}\n\nfunction scalarCall(builder: string, field: RemoteField, warnings: string[]): string {\n const lit = optsLiteral(scalarEntries(field, warnings, builder));\n return lit ? `m.${builder}(${lit})` : `m.${builder}()`;\n}\n\n/** Build the m.* call source for a single field. */\nfunction fieldCall(field: RemoteField, typeToIdent: Map<string, string>, warnings: string[]): string {\n const type = field.type;\n\n if (type === \"rating\") {\n const min = v(field.validations, \"min\");\n const max = v(field.validations, \"max\");\n const e = [`min: ${Number(min ?? 1)}`, `max: ${Number(max ?? 5)}`];\n if (field.required) e.unshift(\"required: true\");\n if (min === undefined || max === undefined) warnings.push(`rating field \"${field.key}\" missing min/max`);\n return `m.rating(${optsLiteral(e)})`;\n }\n\n if (type === \"metaobject_reference\") {\n const target = refTarget(field);\n const ident = target ? typeToIdent.get(target) : undefined;\n if (!ident) {\n warnings.push(`unresolved reference on field \"${field.key}\"`);\n return `m.json() /* TODO: unmapped reference */`;\n }\n return field.required ? `m.ref(() => ${ident}, { required: true })` : `m.ref(() => ${ident})`;\n }\n\n if (type.startsWith(\"list.\")) {\n const inner = type.slice(\"list.\".length);\n const listEntries: string[] = [];\n if (field.required) listEntries.push(\"required: true\");\n const min = v(field.validations, \"list.min\");\n const max = v(field.validations, \"list.max\");\n if (min !== undefined) listEntries.push(`min: ${Number(min)}`);\n if (max !== undefined) listEntries.push(`max: ${Number(max)}`);\n const listOpts = optsLiteral(listEntries);\n let innerCall: string;\n if (inner === \"metaobject_reference\") {\n const target = refTarget(field);\n const ident = target ? typeToIdent.get(target) : undefined;\n if (!ident) {\n warnings.push(`unresolved list reference on field \"${field.key}\"`);\n return `m.json() /* TODO: unmapped list reference */`;\n }\n innerCall = `m.ref(() => ${ident})`;\n } else if (SIMPLE[inner]) {\n // Inner scalar validations (min/max/regex/…) live on the same field; reuse scalarEntries\n // but drop list.* names (already consumed above).\n innerCall = scalarCall(SIMPLE[inner], { ...field, required: false }, warnings);\n } else {\n warnings.push(`unmapped list element type \"${inner}\" on field \"${field.key}\"`);\n return `m.json() /* TODO: unmapped list element ${inner} */`;\n }\n return listOpts ? `m.list(${innerCall}, ${listOpts})` : `m.list(${innerCall})`;\n }\n\n if (SIMPLE[type]) return scalarCall(SIMPLE[type], field, warnings);\n\n warnings.push(`unmapped field type \"${type}\" on field \"${field.key}\"`);\n return `m.json() /* TODO: unmapped type ${type} */`;\n}\n\nfunction defSource(def: RemoteDefinition, typeToIdent: Map<string, string>, warnings: string[]): string {\n const ident = typeToIdent.get(def.type)!;\n const handle = handleOf(def.type);\n const fields = def.fields\n .map((f) => ` ${f.key}: ${fieldCall(f, typeToIdent, warnings)},`)\n .join(\"\\n\");\n const name = def.name ? `\\n name: ${JSON.stringify(def.name)},` : \"\";\n return `export const ${ident} = defineMetaobject(${JSON.stringify(handle)}, {${name}\n fields: {\n${fields}\n },\n});`;\n}\n\n/** Edges: def.type → set of $app: types it references (for topological ordering). */\nfunction referencedTypes(def: RemoteDefinition): Set<string> {\n const out = new Set<string>();\n for (const f of def.fields) {\n if (f.type === \"metaobject_reference\" || f.type === \"list.metaobject_reference\") {\n const t = refTarget(f);\n if (t) out.add(t);\n }\n }\n return out;\n}\n\n/** Kahn topological sort: referenced definitions emitted before referencing ones. */\nfunction orderDefs(defs: RemoteDefinition[]): RemoteDefinition[] {\n const byType = new Map(defs.map((d) => [d.type, d]));\n const deps = new Map(defs.map((d) => [d.type, referencedTypes(d)]));\n const ordered: RemoteDefinition[] = [];\n const placed = new Set<string>();\n let progress = true;\n while (ordered.length < defs.length && progress) {\n progress = false;\n for (const d of defs) {\n if (placed.has(d.type)) continue;\n const unmet = [...(deps.get(d.type) ?? [])].filter((t) => byType.has(t) && !placed.has(t) && t !== d.type);\n if (unmet.length === 0) {\n ordered.push(d);\n placed.add(d.type);\n progress = true;\n }\n }\n }\n // Any remaining (cycles) appended in input order.\n for (const d of defs) if (!placed.has(d.type)) ordered.push(d);\n return ordered;\n}\n\n/**\n * Generate `schema.ts` source (using `defineMetaobject`/`m`) from remote definitions.\n * Definitions are emitted in dependency order so `m.ref(...)` points at a declared const.\n * Unmapped types/validations become `// TODO: unmapped …` and are logged via console.warn.\n */\nexport function generateSchemaSource(defs: RemoteDefinition[]): string {\n const ordered = orderDefs(defs);\n const typeToIdent = new Map(ordered.map((d) => [d.type, identOf(d.type)]));\n const warnings: string[] = [];\n const blocks = ordered.map((d) => defSource(d, typeToIdent, warnings));\n const idents = ordered.map((d) => typeToIdent.get(d.type)!);\n const header = `import { defineMetaobject, m } from \"@fmaplabs/meta-manifest\";`;\n const body = blocks.join(\"\\n\\n\");\n const footer = `export const schemas = [${idents.join(\", \")}];`;\n for (const w of warnings) console.warn(`[meta-manifest] codegen: ${w}`);\n return `${header}\\n\\n${body}\\n\\n${footer}\\n`;\n}\n","import type { FieldValidation } from \"../fields/base\";\nimport type { RemoteDefinition, RemoteField } from \"./normalize\";\n\nexport type DiffOp =\n | { kind: \"createDefinition\"; type: string; definition: RemoteDefinition }\n | { kind: \"addField\"; type: string; field: RemoteField }\n | { kind: \"updateField\"; type: string; key: string; changes: Partial<RemoteField> }\n | { kind: \"changeFieldType\"; type: string; key: string; from: string; to: string; destructive: true }\n | { kind: \"removeField\"; type: string; key: string; destructive: true };\n\nfunction sameValidations(a: FieldValidation[], b: FieldValidation[]): boolean {\n const norm = (v: FieldValidation[]) => JSON.stringify([...v].sort((x, y) => x.name.localeCompare(y.name)));\n return norm(a) === norm(b);\n}\n\nexport function diff(local: RemoteDefinition[], remote: RemoteDefinition[]): DiffOp[] {\n const ops: DiffOp[] = [];\n const remoteByType = new Map(remote.map((d) => [d.type, d]));\n\n for (const localDef of local) {\n const remoteDef = remoteByType.get(localDef.type);\n if (!remoteDef) {\n ops.push({ kind: \"createDefinition\", type: localDef.type, definition: localDef });\n continue;\n }\n const remoteFields = new Map(remoteDef.fields.map((f) => [f.key, f]));\n const localKeys = new Set(localDef.fields.map((f) => f.key));\n\n for (const lf of localDef.fields) {\n const rf = remoteFields.get(lf.key);\n if (!rf) {\n ops.push({ kind: \"addField\", type: localDef.type, field: lf });\n continue;\n }\n if (rf.type !== lf.type) {\n ops.push({ kind: \"changeFieldType\", type: localDef.type, key: lf.key, from: rf.type, to: lf.type, destructive: true });\n continue;\n }\n const changes: Partial<RemoteField> = {};\n if (rf.required !== lf.required) changes.required = lf.required;\n if (!sameValidations(rf.validations, lf.validations)) changes.validations = lf.validations;\n if (Object.keys(changes).length) {\n ops.push({ kind: \"updateField\", type: localDef.type, key: lf.key, changes });\n }\n }\n\n for (const rf of remoteDef.fields) {\n if (!localKeys.has(rf.key)) {\n ops.push({ kind: \"removeField\", type: localDef.type, key: rf.key, destructive: true });\n }\n }\n }\n\n return ops;\n}\n","import type { MetaobjectSchema } from \"../define\";\nimport type { FieldMap } from \"../infer\";\nimport type { FieldValidation } from \"../fields/base\";\n\nexport interface RemoteField {\n key: string;\n type: string;\n required: boolean;\n validations: FieldValidation[];\n}\nexport interface RemoteDefinition {\n type: string;\n name?: string;\n fields: RemoteField[];\n}\n\nexport function normalizeLocal<F extends FieldMap>(schema: MetaobjectSchema<F>): RemoteDefinition {\n const def = schema.toDefinitionInput();\n return {\n type: def.type,\n name: def.name,\n fields: def.fieldDefinitions.map((f) => ({\n key: f.key,\n type: f.type,\n required: f.required,\n validations: f.validations,\n })),\n };\n}\n\nexport interface PulledFieldDefinition {\n key: string;\n type: { name: string } | string;\n required: boolean;\n validations?: FieldValidation[];\n}\nexport interface PulledDefinition {\n type: string;\n name?: string;\n fieldDefinitions: PulledFieldDefinition[];\n}\n\nexport function normalizeRemote(def: PulledDefinition): RemoteDefinition {\n return {\n type: def.type,\n name: def.name,\n fields: def.fieldDefinitions.map((f) => ({\n key: f.key,\n type: typeof f.type === \"string\" ? f.type : f.type.name,\n required: f.required,\n validations: f.validations ?? [],\n })),\n };\n}\n","import type { AdminGraphQLClient } from \"./client\";\nimport { execute, PULL_DEFINITION_QUERY, LIST_DEFINITIONS_QUERY } from \"./client\";\nimport type { PulledDefinition, PulledFieldDefinition } from \"./normalize\";\n\n/**\n * A definition read back from the store. `type` is the canonical \"$app:…\" key\n * (the REQUESTED type, re-labeled from the resolved `app--…` form Shopify\n * returns) so `diff()` matches local↔remote; `id` is the GID `push` threads into\n * update ops. [design §6]\n */\nexport interface PulledRemote {\n id: string;\n type: string;\n definition: PulledDefinition;\n}\n\ninterface PullNode {\n id: string;\n name?: string;\n type: string;\n fieldDefinitions: PulledFieldDefinition[];\n}\ninterface PullResponse {\n metaobjectDefinitionByType: PullNode | null;\n}\n\n/**\n * Reads the current metaobject definitions for the given `$app:` types. A type\n * absent from the store is omitted (so `diff()` emits a create). Each present\n * node is re-labeled with the requested type and its `id` is captured. [design §6]\n */\nexport async function pull(client: AdminGraphQLClient, types: readonly string[]): Promise<PulledRemote[]> {\n const out: PulledRemote[] = [];\n for (const type of types) {\n const data = await execute<PullResponse>(client, PULL_DEFINITION_QUERY, { type });\n const node = data.metaobjectDefinitionByType;\n if (!node) continue;\n out.push({\n id: node.id,\n type,\n definition: { type, name: node.name, fieldDefinitions: node.fieldDefinitions },\n });\n }\n return out;\n}\n\ninterface ListResponse {\n metaobjectDefinitions: {\n nodes: PullNode[];\n pageInfo: { hasNextPage: boolean; endCursor: string | null };\n };\n}\n\n/** Convert Shopify's resolved app type (\"app--<id>--<handle>\") to canonical \"$app:<handle>\". */\nfunction toCanonicalType(resolved: string): string | null {\n const m = /^app--\\d+--(.+)$/.exec(resolved);\n return m ? `$app:${m[1]}` : null;\n}\n\n/**\n * Enumerate every metaobject definition in the store. By default returns only\n * app-owned definitions, re-labeled to canonical \"$app:<handle>\" types so they\n * round-trip through `defineMetaobject`. [design §3]\n */\nexport async function pullAll(\n client: AdminGraphQLClient,\n opts: { appOwnedOnly?: boolean } = {},\n): Promise<PulledRemote[]> {\n const appOwnedOnly = opts.appOwnedOnly ?? true;\n const out: PulledRemote[] = [];\n let after: string | null = null;\n do {\n const data: ListResponse = await execute<ListResponse>(client, LIST_DEFINITIONS_QUERY, { after });\n for (const node of data.metaobjectDefinitions.nodes) {\n const canonical = toCanonicalType(node.type);\n if (appOwnedOnly && !canonical) continue;\n const type = canonical ?? node.type;\n out.push({ id: node.id, type, definition: { type, name: node.name, fieldDefinitions: node.fieldDefinitions } });\n }\n after = data.metaobjectDefinitions.pageInfo.hasNextPage ? data.metaobjectDefinitions.pageInfo.endCursor : null;\n } while (after !== null);\n return out;\n}\n","import type { FieldValidation } from \"../fields/base\";\nimport type { FieldDefinitionInput, MetaobjectDefinitionInput } from \"../definition-input\";\nimport { CREATE_DEFINITION_MUTATION, execute, UPDATE_DEFINITION_MUTATION, type AdminGraphQLClient } from \"./client\";\nimport type { DiffOp } from \"./diff\";\nimport type { PulledRemote } from \"./pull\";\n\nexport interface PushOptions {\n /** Apply destructive ops (`removeField`, `changeFieldType`). Default false. */\n allowDestructive?: boolean;\n}\n\nexport type PushOpResult =\n | { op: DiffOp; status: \"applied\"; id?: string }\n | { op: DiffOp; status: \"skipped\"; reason: \"destructive\" }\n | { op: DiffOp; status: \"blocked\"; reason: string }\n | { op: DiffOp; status: \"failed\"; userErrors: UserError[] };\n\nexport interface PushResult {\n results: PushOpResult[];\n counts: { applied: number; skipped: number; blocked: number; failed: number };\n ok: boolean;\n}\n\ntype UserError = { field?: string[]; message: string; code?: string };\ntype MutationPayload = { metaobjectDefinition?: { id?: string } | null; userErrors: UserError[] };\ntype FieldOpInput =\n | { create: FieldDefinitionInput }\n | { update: { key: string; name: string; description?: string; required: boolean; validations: FieldValidation[] } }\n | { delete: { key: string } };\n\n/** The full local field input for a field, used to build create/update payloads. [design §7] */\nfunction fieldInputFor(\n defByType: Map<string, MetaobjectDefinitionInput>,\n type: string,\n key: string,\n): FieldDefinitionInput | undefined {\n return defByType.get(type)?.fieldDefinitions.find((f) => f.key === key);\n}\n\n/**\n * The `$app:` types a definition references, read from each field's\n * `metaobject_definition_type` (single) and `metaobject_definition_types` (JSON\n * array) validations. These are the dependency edges for create ordering. [design §7]\n */\nexport function referenceEdges(def: MetaobjectDefinitionInput): string[] {\n const out: string[] = [];\n for (const field of def.fieldDefinitions) {\n for (const v of field.validations) {\n if (v.name === \"metaobject_definition_type\") {\n out.push(v.value);\n } else if (v.name === \"metaobject_definition_types\") {\n try {\n const parsed: unknown = JSON.parse(v.value);\n if (Array.isArray(parsed)) for (const t of parsed) if (typeof t === \"string\") out.push(t);\n } catch {\n // Ignore a malformed validation value rather than failing the push.\n }\n }\n }\n }\n return out;\n}\n\n/**\n * Kahn's topological sort: returns create `types` in dependency-first order.\n * Types left unordered are entangled in a reference cycle. [design §7]\n */\nfunction topoSortCreates(types: Set<string>, deps: Map<string, Set<string>>): { ordered: string[]; unordered: string[] } {\n const remaining = new Map<string, number>();\n const dependents = new Map<string, string[]>();\n for (const t of types) {\n const d = deps.get(t) ?? new Set<string>();\n remaining.set(t, d.size);\n for (const dep of d) {\n const list = dependents.get(dep) ?? [];\n list.push(t);\n dependents.set(dep, list);\n }\n }\n\n const queue: string[] = [];\n for (const t of types) if ((remaining.get(t) ?? 0) === 0) queue.push(t);\n\n const ordered: string[] = [];\n while (queue.length) {\n const t = queue.shift() as string;\n ordered.push(t);\n for (const dependent of dependents.get(t) ?? []) {\n const r = (remaining.get(dependent) ?? 0) - 1;\n remaining.set(dependent, r);\n if (r === 0) queue.push(dependent);\n }\n }\n\n const orderedSet = new Set(ordered);\n return { ordered, unordered: [...types].filter((t) => !orderedSet.has(t)) };\n}\n\n/**\n * Applies a `diff()` plan to a store. Safe ops run; destructive ops are skipped\n * unless `allowDestructive`. Per-op `userErrors` become `failed` entries (never\n * thrown); only transport / top-level GraphQL errors propagate. [design §7, §8]\n *\n * Create ops run in dependency order (a referenced type before its referencer);\n * types in a reference cycle are `blocked`. Results are returned in plan order;\n * client calls happen in execution order. [design §7]\n */\nexport async function push(\n client: AdminGraphQLClient,\n plan: DiffOp[],\n sources: { definitions: MetaobjectDefinitionInput[]; remote: PulledRemote[] },\n options?: PushOptions,\n): Promise<PushResult> {\n const allowDestructive = options?.allowDestructive ?? false;\n const defByType = new Map(sources.definitions.map((d) => [d.type, d]));\n const idByType = new Map(sources.remote.map((r) => [r.type, r.id]));\n\n const indexed = plan.map((op, index) => ({ op, index }));\n const createOps = indexed.filter((x) => x.op.kind === \"createDefinition\");\n const otherOps = indexed.filter((x) => x.op.kind !== \"createDefinition\");\n const createTypes = new Set(createOps.map((x) => x.op.type));\n\n // Dependency edges among the types being created this run. Self-edges are\n // excluded: a self-referential definition creates normally rather than being\n // flagged a length-1 cycle (deliberate; the spec does not address it).\n const deps = new Map<string, Set<string>>();\n for (const { op } of createOps) {\n const def = defByType.get(op.type);\n const targets = def ? referenceEdges(def) : [];\n deps.set(op.type, new Set(targets.filter((t) => createTypes.has(t) && t !== op.type)));\n }\n\n const { ordered, unordered } = topoSortCreates(createTypes, deps);\n const orderedSet = new Set(ordered);\n const cyclicTypes = new Set(unordered);\n const createByType = new Map(createOps.map((x) => [x.op.type, x]));\n const execOrder = [\n ...ordered.map((t) => createByType.get(t) as { op: DiffOp; index: number }),\n ...createOps.filter((x) => !orderedSet.has(x.op.type)),\n ...otherOps,\n ];\n\n // Types whose create this run failed or was blocked — their dependents block too.\n const failedTypes = new Set<string>();\n\n async function applyOp(op: DiffOp): Promise<PushOpResult> {\n if (op.kind === \"createDefinition\") {\n if (cyclicTypes.has(op.type)) {\n failedTypes.add(op.type);\n return { op, status: \"blocked\", reason: \"reference cycle — two-pass create deferred\" };\n }\n for (const dep of deps.get(op.type) ?? []) {\n if (failedTypes.has(dep)) {\n failedTypes.add(op.type);\n return { op, status: \"blocked\", reason: `blocked: dependency \"${dep}\" was not created` };\n }\n }\n const def = defByType.get(op.type);\n if (!def) {\n failedTypes.add(op.type);\n return { op, status: \"blocked\", reason: `no definition input for \"${op.type}\"` };\n }\n const data = await execute<{ metaobjectDefinitionCreate: MutationPayload }>(client, CREATE_DEFINITION_MUTATION, { definition: def });\n const payload = data.metaobjectDefinitionCreate;\n if (payload.userErrors.length) {\n failedTypes.add(op.type);\n return { op, status: \"failed\", userErrors: payload.userErrors };\n }\n const id = payload.metaobjectDefinition?.id;\n if (id) idByType.set(op.type, id);\n return { op, status: \"applied\", id };\n }\n\n const destructive = op.kind === \"removeField\" || op.kind === \"changeFieldType\";\n if (destructive && !allowDestructive) return { op, status: \"skipped\", reason: \"destructive\" };\n\n if (failedTypes.has(op.type)) return { op, status: \"blocked\", reason: `blocked: definition \"${op.type}\" was not created` };\n\n const id = idByType.get(op.type);\n if (id == null) return { op, status: \"blocked\", reason: `no definition id for \"${op.type}\"` };\n\n const fieldDefinitions = fieldOpsFor(op);\n if (!fieldDefinitions) return { op, status: \"blocked\", reason: `no field input for \"${op.type}\"` };\n\n const data = await execute<{ metaobjectDefinitionUpdate: MutationPayload }>(client, UPDATE_DEFINITION_MUTATION, { id, definition: { fieldDefinitions } });\n const payload = data.metaobjectDefinitionUpdate;\n if (payload.userErrors.length) return { op, status: \"failed\", userErrors: payload.userErrors };\n return { op, status: \"applied\", id: payload.metaobjectDefinition?.id ?? id };\n }\n\n /** Builds the `fieldDefinitions` tagged-union ops for a field-level diff op. [design §7] */\n function fieldOpsFor(op: DiffOp): FieldOpInput[] | undefined {\n switch (op.kind) {\n case \"addField\": {\n const field = fieldInputFor(defByType, op.type, op.field.key);\n return field ? [{ create: field }] : undefined;\n }\n case \"updateField\": {\n const field = fieldInputFor(defByType, op.type, op.key);\n if (!field) return undefined;\n // `type` is immutable, so the update payload omits it. [design §7]\n const update: { key: string; name: string; description?: string; required: boolean; validations: FieldValidation[] } = {\n key: field.key,\n name: field.name,\n required: field.required,\n validations: field.validations,\n };\n if (field.description != null) update.description = field.description;\n return [{ update }];\n }\n case \"removeField\":\n return [{ delete: { key: op.key } }];\n case \"changeFieldType\": {\n const field = fieldInputFor(defByType, op.type, op.key);\n return field ? [{ delete: { key: op.key } }, { create: field }] : undefined;\n }\n default:\n return undefined;\n }\n }\n\n // Execute in dependency order; record each result at its original plan index so\n // the returned `results` align with the caller's plan. [design §7]\n const results: PushOpResult[] = new Array(plan.length);\n for (const { op, index } of execOrder) results[index] = await applyOp(op);\n\n const counts = { applied: 0, skipped: 0, blocked: 0, failed: 0 };\n for (const r of results) counts[r.status]++;\n return { results, counts, ok: counts.failed === 0 && counts.blocked === 0 };\n}\n","import type { AdminGraphQLClient, DiffOp, PulledRemote } from \"../index\";\nimport { diff, normalizeLocal, normalizeRemote, pull } from \"../index\";\nimport type { AnySchema } from \"../index\";\n\n/** Pull the schemas' types, normalize, and diff local↔remote. */\nexport async function planFor(\n client: AdminGraphQLClient,\n schemas: AnySchema[],\n): Promise<{ plan: DiffOp[]; remote: PulledRemote[] }> {\n const types = schemas.map((s) => s.type);\n const localDefs = schemas.map(normalizeLocal);\n const remote = await pull(client, types);\n const plan = diff(localDefs, remote.map((r) => normalizeRemote(r.definition)));\n return { plan, remote };\n}\n","import type { DiffOp, PushOpResult } from \"../index\";\n\nexport function opTarget(op: DiffOp): string {\n if (op.kind === \"addField\") return `${op.type}.${op.field.key}`;\n if (\"key\" in op) return `${op.type}.${op.key}`;\n return op.type;\n}\n\nexport function isDestructive(op: DiffOp): boolean {\n return \"destructive\" in op && op.destructive === true;\n}\n\nexport function describeOp(op: DiffOp): string {\n return `${op.kind}: ${opTarget(op)}${isDestructive(op) ? \" · destructive\" : \"\"}`;\n}\n\nexport function describeResult(r: PushOpResult): string {\n const head = `${r.op.kind}: ${opTarget(r.op)}`;\n switch (r.status) {\n case \"applied\":\n return `✓ applied — ${head}`;\n case \"skipped\":\n return `– skipped (${r.reason}) — ${head}`;\n case \"blocked\":\n return `⚠ blocked (${r.reason}) — ${head}`;\n case \"failed\":\n return `✗ failed (${r.userErrors.map((e) => e.message).join(\"; \")}) — ${head}`;\n }\n}\n","import type { AdminGraphQLClient, DiffOp } from \"../index\";\nimport type { AnySchema } from \"../index\";\nimport { planFor } from \"./plan\";\nimport { describeOp } from \"./format\";\n\nexport async function runDiff(args: { client: AdminGraphQLClient; schemas: AnySchema[] }): Promise<DiffOp[]> {\n const { plan } = await planFor(args.client, args.schemas);\n if (plan.length === 0) {\n console.log(\"Everything is in sync — nothing to apply.\");\n } else {\n console.log(`${plan.length} change${plan.length === 1 ? \"\" : \"s\"} would be applied:`);\n for (const op of plan) console.log(` ${describeOp(op)}`);\n }\n return plan;\n}\n","import type { AdminGraphQLClient, PushResult } from \"../index\";\nimport type { AnySchema } from \"../index\";\nimport { push } from \"../index\";\nimport { planFor } from \"./plan\";\nimport { describeResult, isDestructive } from \"./format\";\n\nexport async function runPush(args: {\n client: AdminGraphQLClient;\n schemas: AnySchema[];\n allowDestructive?: boolean;\n}): Promise<PushResult> {\n const { plan, remote } = await planFor(args.client, args.schemas);\n const definitions = args.schemas.map((s) => s.toDefinitionInput());\n const result = await push(args.client, plan, { definitions, remote }, { allowDestructive: args.allowDestructive });\n\n for (const r of result.results) console.log(` ${describeResult(r)}`);\n console.log(\n `applied ${result.counts.applied} · skipped ${result.counts.skipped} · ` +\n `blocked ${result.counts.blocked} · failed ${result.counts.failed}`,\n );\n if (!args.allowDestructive && plan.some(isDestructive)) {\n console.log(\"Some destructive changes were skipped. Re-run with --allow-destructive to apply them.\");\n }\n return result;\n}\n","import { existsSync, mkdirSync, writeFileSync } from \"node:fs\";\nimport { dirname, resolve } from \"node:path\";\nimport type { AdminGraphQLClient } from \"../index\";\nimport { generateSchemaSource, normalizeRemote, pullAll } from \"../index\";\n\n/** Format source with the user's local prettier if available; otherwise return as-is. */\nasync function maybeFormat(source: string): Promise<string> {\n try {\n const spec = \"prettier\";\n const prettier = await import(spec);\n return await prettier.format(source, { parser: \"typescript\" });\n } catch {\n return source;\n }\n}\n\nexport async function runPull(args: {\n client: AdminGraphQLClient;\n schemaPath: string;\n force?: boolean;\n}): Promise<{ written: string; count: number }> {\n const remote = await pullAll(args.client); // app-owned only\n const defs = remote.map((r) => normalizeRemote(r.definition));\n const source = await maybeFormat(generateSchemaSource(defs));\n\n const abs = resolve(process.cwd(), args.schemaPath);\n if (existsSync(abs) && !args.force) {\n console.warn(`Overwriting existing ${args.schemaPath}.`);\n }\n mkdirSync(dirname(abs), { recursive: true });\n writeFileSync(abs, source);\n console.log(`Wrote ${defs.length} definition${defs.length === 1 ? \"\" : \"s\"} to ${args.schemaPath}.`);\n return { written: abs, count: defs.length };\n}\n"],"mappings":"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","names":["import_node_path","v","m","v","list","data","payload","id","import_node_fs","import_node_path"]}
@@ -0,0 +1,12 @@
1
+ #!/usr/bin/env node
2
+ interface Args {
3
+ command?: string;
4
+ config?: string;
5
+ allowDestructive: boolean;
6
+ force: boolean;
7
+ help: boolean;
8
+ }
9
+ declare function parseArgs(argv: string[]): Args;
10
+ declare function main(argv: string[]): Promise<number>;
11
+
12
+ export { type Args, main, parseArgs };
@@ -0,0 +1,12 @@
1
+ #!/usr/bin/env node
2
+ interface Args {
3
+ command?: string;
4
+ config?: string;
5
+ allowDestructive: boolean;
6
+ force: boolean;
7
+ help: boolean;
8
+ }
9
+ declare function parseArgs(argv: string[]): Args;
10
+ declare function main(argv: string[]): Promise<number>;
11
+
12
+ export { type Args, main, parseArgs };
@@ -0,0 +1,239 @@
1
+ #!/usr/bin/env node
2
+ import {
3
+ diff,
4
+ generateSchemaSource,
5
+ normalizeLocal,
6
+ normalizeRemote,
7
+ pull,
8
+ pullAll,
9
+ push
10
+ } from "../chunk-GH5DXHS5.js";
11
+ import {
12
+ createAdminClient
13
+ } from "../chunk-PFU5VAO7.js";
14
+ import {
15
+ SyncTransportError,
16
+ validateConfig
17
+ } from "../chunk-3R6VQ3Z3.js";
18
+
19
+ // src/cli/load-config.ts
20
+ import { resolve } from "path";
21
+ import { createJiti } from "jiti";
22
+ var jiti = createJiti(import.meta.url);
23
+ async function loadConfig(configPath = "meta-manifest.config.ts") {
24
+ const abs = resolve(process.cwd(), configPath);
25
+ const mod = await jiti.import(abs);
26
+ return validateConfig(mod.default);
27
+ }
28
+ async function loadSchemas(schemaPath) {
29
+ const abs = resolve(process.cwd(), schemaPath);
30
+ const mod = await jiti.import(abs);
31
+ if (!Array.isArray(mod.schemas)) {
32
+ throw new Error(`Schema module "${schemaPath}" must export a \`schemas\` array.`);
33
+ }
34
+ return mod.schemas;
35
+ }
36
+
37
+ // src/cli/init.ts
38
+ import { existsSync, mkdirSync, writeFileSync } from "fs";
39
+ import { dirname, join } from "path";
40
+ var CONFIG_TEMPLATE = `import { defineConfig } from "@fmaplabs/meta-manifest";
41
+
42
+ export default defineConfig({
43
+ shop: "my-store.myshopify.com",
44
+ accessToken: process.env.SHOPIFY_ADMIN_TOKEN!,
45
+ schema: "./src/schema.ts",
46
+ });
47
+ `;
48
+ var SCHEMA_TEMPLATE = `import { defineMetaobject, m } from "@fmaplabs/meta-manifest";
49
+
50
+ export const Author = defineMetaobject("author", {
51
+ name: "Author",
52
+ fields: {
53
+ name: m.text({ required: true, max: 120 }),
54
+ bio: m.multilineText(),
55
+ },
56
+ });
57
+
58
+ export const schemas = [Author];
59
+ `;
60
+ async function runInit(opts = {}) {
61
+ const cwd = opts.cwd ?? process.cwd();
62
+ const created = [];
63
+ const write = (rel, contents) => {
64
+ const abs = join(cwd, rel);
65
+ if (existsSync(abs)) return;
66
+ mkdirSync(dirname(abs), { recursive: true });
67
+ writeFileSync(abs, contents);
68
+ created.push(rel);
69
+ };
70
+ write("meta-manifest.config.ts", CONFIG_TEMPLATE);
71
+ write("src/schema.ts", SCHEMA_TEMPLATE);
72
+ if (created.length) {
73
+ console.log(`Created: ${created.join(", ")}`);
74
+ console.log("Next: set SHOPIFY_ADMIN_TOKEN in your env, edit meta-manifest.config.ts, then run `mm diff`.");
75
+ } else {
76
+ console.log("Nothing to do \u2014 config and schema already exist.");
77
+ }
78
+ return { created };
79
+ }
80
+
81
+ // src/cli/plan.ts
82
+ async function planFor(client, schemas) {
83
+ const types = schemas.map((s) => s.type);
84
+ const localDefs = schemas.map(normalizeLocal);
85
+ const remote = await pull(client, types);
86
+ const plan = diff(localDefs, remote.map((r) => normalizeRemote(r.definition)));
87
+ return { plan, remote };
88
+ }
89
+
90
+ // src/cli/format.ts
91
+ function opTarget(op) {
92
+ if (op.kind === "addField") return `${op.type}.${op.field.key}`;
93
+ if ("key" in op) return `${op.type}.${op.key}`;
94
+ return op.type;
95
+ }
96
+ function isDestructive(op) {
97
+ return "destructive" in op && op.destructive === true;
98
+ }
99
+ function describeOp(op) {
100
+ return `${op.kind}: ${opTarget(op)}${isDestructive(op) ? " \xB7 destructive" : ""}`;
101
+ }
102
+ function describeResult(r) {
103
+ const head = `${r.op.kind}: ${opTarget(r.op)}`;
104
+ switch (r.status) {
105
+ case "applied":
106
+ return `\u2713 applied \u2014 ${head}`;
107
+ case "skipped":
108
+ return `\u2013 skipped (${r.reason}) \u2014 ${head}`;
109
+ case "blocked":
110
+ return `\u26A0 blocked (${r.reason}) \u2014 ${head}`;
111
+ case "failed":
112
+ return `\u2717 failed (${r.userErrors.map((e) => e.message).join("; ")}) \u2014 ${head}`;
113
+ }
114
+ }
115
+
116
+ // src/cli/diff.ts
117
+ async function runDiff(args) {
118
+ const { plan } = await planFor(args.client, args.schemas);
119
+ if (plan.length === 0) {
120
+ console.log("Everything is in sync \u2014 nothing to apply.");
121
+ } else {
122
+ console.log(`${plan.length} change${plan.length === 1 ? "" : "s"} would be applied:`);
123
+ for (const op of plan) console.log(` ${describeOp(op)}`);
124
+ }
125
+ return plan;
126
+ }
127
+
128
+ // src/cli/push.ts
129
+ async function runPush(args) {
130
+ const { plan, remote } = await planFor(args.client, args.schemas);
131
+ const definitions = args.schemas.map((s) => s.toDefinitionInput());
132
+ const result = await push(args.client, plan, { definitions, remote }, { allowDestructive: args.allowDestructive });
133
+ for (const r of result.results) console.log(` ${describeResult(r)}`);
134
+ console.log(
135
+ `applied ${result.counts.applied} \xB7 skipped ${result.counts.skipped} \xB7 blocked ${result.counts.blocked} \xB7 failed ${result.counts.failed}`
136
+ );
137
+ if (!args.allowDestructive && plan.some(isDestructive)) {
138
+ console.log("Some destructive changes were skipped. Re-run with --allow-destructive to apply them.");
139
+ }
140
+ return result;
141
+ }
142
+
143
+ // src/cli/pull.ts
144
+ import { existsSync as existsSync2, mkdirSync as mkdirSync2, writeFileSync as writeFileSync2 } from "fs";
145
+ import { dirname as dirname2, resolve as resolve2 } from "path";
146
+ async function maybeFormat(source) {
147
+ try {
148
+ const spec = "prettier";
149
+ const prettier = await import(spec);
150
+ return await prettier.format(source, { parser: "typescript" });
151
+ } catch {
152
+ return source;
153
+ }
154
+ }
155
+ async function runPull(args) {
156
+ const remote = await pullAll(args.client);
157
+ const defs = remote.map((r) => normalizeRemote(r.definition));
158
+ const source = await maybeFormat(generateSchemaSource(defs));
159
+ const abs = resolve2(process.cwd(), args.schemaPath);
160
+ if (existsSync2(abs) && !args.force) {
161
+ console.warn(`Overwriting existing ${args.schemaPath}.`);
162
+ }
163
+ mkdirSync2(dirname2(abs), { recursive: true });
164
+ writeFileSync2(abs, source);
165
+ console.log(`Wrote ${defs.length} definition${defs.length === 1 ? "" : "s"} to ${args.schemaPath}.`);
166
+ return { written: abs, count: defs.length };
167
+ }
168
+
169
+ // src/cli/index.ts
170
+ function parseArgs(argv) {
171
+ const args = { allowDestructive: false, force: false, help: false };
172
+ for (let i = 0; i < argv.length; i++) {
173
+ const a = argv[i];
174
+ if (a === "--help" || a === "-h") args.help = true;
175
+ else if (a === "--allow-destructive") args.allowDestructive = true;
176
+ else if (a === "--force") args.force = true;
177
+ else if (a === "--config") args.config = argv[++i];
178
+ else if (!a.startsWith("-") && !args.command) args.command = a;
179
+ }
180
+ return args;
181
+ }
182
+ var HELP = `meta-manifest \u2014 sync Shopify metaobject definitions
183
+
184
+ Usage: mm <command> [options]
185
+
186
+ Commands:
187
+ init Scaffold meta-manifest.config.ts + src/schema.ts
188
+ pull Enumerate remote definitions and write schema source
189
+ diff Show the changes a push would apply
190
+ push Apply local schema to the store
191
+
192
+ Options:
193
+ --config <path> Config file (default: meta-manifest.config.ts)
194
+ --allow-destructive Apply destructive changes on push
195
+ --force Overwrite schema on pull without warning
196
+ -h, --help Show this help`;
197
+ async function main(argv) {
198
+ const args = parseArgs(argv);
199
+ if (args.help || !args.command) {
200
+ console.log(HELP);
201
+ return args.command ? 0 : args.help ? 0 : 1;
202
+ }
203
+ try {
204
+ if (args.command === "init") {
205
+ await runInit();
206
+ return 0;
207
+ }
208
+ const config = await loadConfig(args.config);
209
+ const client = createAdminClient(config);
210
+ if (args.command === "pull") {
211
+ await runPull({ client, schemaPath: config.schema, force: args.force });
212
+ return 0;
213
+ }
214
+ const schemas = await loadSchemas(config.schema);
215
+ if (args.command === "diff") {
216
+ await runDiff({ client, schemas });
217
+ return 0;
218
+ }
219
+ if (args.command === "push") {
220
+ const result = await runPush({ client, schemas, allowDestructive: args.allowDestructive });
221
+ return result.ok ? 0 : 2;
222
+ }
223
+ console.error(`Unknown command: ${args.command}`);
224
+ console.log(HELP);
225
+ return 1;
226
+ } catch (err) {
227
+ if (err instanceof SyncTransportError) console.error(`Sync failed: Shopify rejected a request.`);
228
+ else console.error(err instanceof Error ? err.message : String(err));
229
+ return 1;
230
+ }
231
+ }
232
+ if (process.env.VITEST === void 0) {
233
+ main(process.argv.slice(2)).then((code) => process.exit(code));
234
+ }
235
+ export {
236
+ main,
237
+ parseArgs
238
+ };
239
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/cli/load-config.ts","../../src/cli/init.ts","../../src/cli/plan.ts","../../src/cli/format.ts","../../src/cli/diff.ts","../../src/cli/push.ts","../../src/cli/pull.ts","../../src/cli/index.ts"],"sourcesContent":["import { resolve } from \"node:path\";\nimport { createJiti } from \"jiti\";\nimport { validateConfig } from \"../config\";\nimport type { Config } from \"../config\";\nimport type { AnySchema } from \"../index\";\n\nconst jiti = createJiti(import.meta.url);\n\n/** Load and validate meta-manifest.config.ts (default: ./meta-manifest.config.ts). */\nexport async function loadConfig(configPath = \"meta-manifest.config.ts\"): Promise<Config> {\n const abs = resolve(process.cwd(), configPath);\n const mod = await jiti.import<{ default?: unknown }>(abs);\n return validateConfig(mod.default);\n}\n\n/** Load the `schemas` export from a schema module. */\nexport async function loadSchemas(schemaPath: string): Promise<AnySchema[]> {\n const abs = resolve(process.cwd(), schemaPath);\n const mod = await jiti.import<{ schemas?: unknown }>(abs);\n if (!Array.isArray(mod.schemas)) {\n throw new Error(`Schema module \"${schemaPath}\" must export a \\`schemas\\` array.`);\n }\n return mod.schemas as AnySchema[];\n}\n","import { existsSync, mkdirSync, writeFileSync } from \"node:fs\";\nimport { dirname, join } from \"node:path\";\n\nconst CONFIG_TEMPLATE = `import { defineConfig } from \"@fmaplabs/meta-manifest\";\n\nexport default defineConfig({\n shop: \"my-store.myshopify.com\",\n accessToken: process.env.SHOPIFY_ADMIN_TOKEN!,\n schema: \"./src/schema.ts\",\n});\n`;\n\nconst SCHEMA_TEMPLATE = `import { defineMetaobject, m } from \"@fmaplabs/meta-manifest\";\n\nexport const Author = defineMetaobject(\"author\", {\n name: \"Author\",\n fields: {\n name: m.text({ required: true, max: 120 }),\n bio: m.multilineText(),\n },\n});\n\nexport const schemas = [Author];\n`;\n\n/** Scaffold config + schema files, never overwriting existing ones. */\nexport async function runInit(opts: { cwd?: string } = {}): Promise<{ created: string[] }> {\n const cwd = opts.cwd ?? process.cwd();\n const created: string[] = [];\n const write = (rel: string, contents: string) => {\n const abs = join(cwd, rel);\n if (existsSync(abs)) return;\n mkdirSync(dirname(abs), { recursive: true });\n writeFileSync(abs, contents);\n created.push(rel);\n };\n write(\"meta-manifest.config.ts\", CONFIG_TEMPLATE);\n write(\"src/schema.ts\", SCHEMA_TEMPLATE);\n if (created.length) {\n console.log(`Created: ${created.join(\", \")}`);\n console.log(\"Next: set SHOPIFY_ADMIN_TOKEN in your env, edit meta-manifest.config.ts, then run `mm diff`.\");\n } else {\n console.log(\"Nothing to do — config and schema already exist.\");\n }\n return { created };\n}\n","import type { AdminGraphQLClient, DiffOp, PulledRemote } from \"../index\";\nimport { diff, normalizeLocal, normalizeRemote, pull } from \"../index\";\nimport type { AnySchema } from \"../index\";\n\n/** Pull the schemas' types, normalize, and diff local↔remote. */\nexport async function planFor(\n client: AdminGraphQLClient,\n schemas: AnySchema[],\n): Promise<{ plan: DiffOp[]; remote: PulledRemote[] }> {\n const types = schemas.map((s) => s.type);\n const localDefs = schemas.map(normalizeLocal);\n const remote = await pull(client, types);\n const plan = diff(localDefs, remote.map((r) => normalizeRemote(r.definition)));\n return { plan, remote };\n}\n","import type { DiffOp, PushOpResult } from \"../index\";\n\nexport function opTarget(op: DiffOp): string {\n if (op.kind === \"addField\") return `${op.type}.${op.field.key}`;\n if (\"key\" in op) return `${op.type}.${op.key}`;\n return op.type;\n}\n\nexport function isDestructive(op: DiffOp): boolean {\n return \"destructive\" in op && op.destructive === true;\n}\n\nexport function describeOp(op: DiffOp): string {\n return `${op.kind}: ${opTarget(op)}${isDestructive(op) ? \" · destructive\" : \"\"}`;\n}\n\nexport function describeResult(r: PushOpResult): string {\n const head = `${r.op.kind}: ${opTarget(r.op)}`;\n switch (r.status) {\n case \"applied\":\n return `✓ applied — ${head}`;\n case \"skipped\":\n return `– skipped (${r.reason}) — ${head}`;\n case \"blocked\":\n return `⚠ blocked (${r.reason}) — ${head}`;\n case \"failed\":\n return `✗ failed (${r.userErrors.map((e) => e.message).join(\"; \")}) — ${head}`;\n }\n}\n","import type { AdminGraphQLClient, DiffOp } from \"../index\";\nimport type { AnySchema } from \"../index\";\nimport { planFor } from \"./plan\";\nimport { describeOp } from \"./format\";\n\nexport async function runDiff(args: { client: AdminGraphQLClient; schemas: AnySchema[] }): Promise<DiffOp[]> {\n const { plan } = await planFor(args.client, args.schemas);\n if (plan.length === 0) {\n console.log(\"Everything is in sync — nothing to apply.\");\n } else {\n console.log(`${plan.length} change${plan.length === 1 ? \"\" : \"s\"} would be applied:`);\n for (const op of plan) console.log(` ${describeOp(op)}`);\n }\n return plan;\n}\n","import type { AdminGraphQLClient, PushResult } from \"../index\";\nimport type { AnySchema } from \"../index\";\nimport { push } from \"../index\";\nimport { planFor } from \"./plan\";\nimport { describeResult, isDestructive } from \"./format\";\n\nexport async function runPush(args: {\n client: AdminGraphQLClient;\n schemas: AnySchema[];\n allowDestructive?: boolean;\n}): Promise<PushResult> {\n const { plan, remote } = await planFor(args.client, args.schemas);\n const definitions = args.schemas.map((s) => s.toDefinitionInput());\n const result = await push(args.client, plan, { definitions, remote }, { allowDestructive: args.allowDestructive });\n\n for (const r of result.results) console.log(` ${describeResult(r)}`);\n console.log(\n `applied ${result.counts.applied} · skipped ${result.counts.skipped} · ` +\n `blocked ${result.counts.blocked} · failed ${result.counts.failed}`,\n );\n if (!args.allowDestructive && plan.some(isDestructive)) {\n console.log(\"Some destructive changes were skipped. Re-run with --allow-destructive to apply them.\");\n }\n return result;\n}\n","import { existsSync, mkdirSync, writeFileSync } from \"node:fs\";\nimport { dirname, resolve } from \"node:path\";\nimport type { AdminGraphQLClient } from \"../index\";\nimport { generateSchemaSource, normalizeRemote, pullAll } from \"../index\";\n\n/** Format source with the user's local prettier if available; otherwise return as-is. */\nasync function maybeFormat(source: string): Promise<string> {\n try {\n const spec = \"prettier\";\n const prettier = await import(spec);\n return await prettier.format(source, { parser: \"typescript\" });\n } catch {\n return source;\n }\n}\n\nexport async function runPull(args: {\n client: AdminGraphQLClient;\n schemaPath: string;\n force?: boolean;\n}): Promise<{ written: string; count: number }> {\n const remote = await pullAll(args.client); // app-owned only\n const defs = remote.map((r) => normalizeRemote(r.definition));\n const source = await maybeFormat(generateSchemaSource(defs));\n\n const abs = resolve(process.cwd(), args.schemaPath);\n if (existsSync(abs) && !args.force) {\n console.warn(`Overwriting existing ${args.schemaPath}.`);\n }\n mkdirSync(dirname(abs), { recursive: true });\n writeFileSync(abs, source);\n console.log(`Wrote ${defs.length} definition${defs.length === 1 ? \"\" : \"s\"} to ${args.schemaPath}.`);\n return { written: abs, count: defs.length };\n}\n","#!/usr/bin/env node\nimport { SyncTransportError } from \"../sync/client\";\nimport { createAdminClient } from \"../node/client\";\nimport { loadConfig, loadSchemas } from \"./load-config\";\nimport { runInit } from \"./init\";\nimport { runDiff } from \"./diff\";\nimport { runPush } from \"./push\";\nimport { runPull } from \"./pull\";\n\nexport interface Args {\n command?: string;\n config?: string;\n allowDestructive: boolean;\n force: boolean;\n help: boolean;\n}\n\nexport function parseArgs(argv: string[]): Args {\n const args: Args = { allowDestructive: false, force: false, help: false };\n for (let i = 0; i < argv.length; i++) {\n const a = argv[i];\n if (a === \"--help\" || a === \"-h\") args.help = true;\n else if (a === \"--allow-destructive\") args.allowDestructive = true;\n else if (a === \"--force\") args.force = true;\n else if (a === \"--config\") args.config = argv[++i];\n else if (!a.startsWith(\"-\") && !args.command) args.command = a;\n }\n return args;\n}\n\nconst HELP = `meta-manifest — sync Shopify metaobject definitions\n\nUsage: mm <command> [options]\n\nCommands:\n init Scaffold meta-manifest.config.ts + src/schema.ts\n pull Enumerate remote definitions and write schema source\n diff Show the changes a push would apply\n push Apply local schema to the store\n\nOptions:\n --config <path> Config file (default: meta-manifest.config.ts)\n --allow-destructive Apply destructive changes on push\n --force Overwrite schema on pull without warning\n -h, --help Show this help`;\n\nexport async function main(argv: string[]): Promise<number> {\n const args = parseArgs(argv);\n if (args.help || !args.command) {\n console.log(HELP);\n return args.command ? 0 : args.help ? 0 : 1;\n }\n try {\n if (args.command === \"init\") {\n await runInit();\n return 0;\n }\n const config = await loadConfig(args.config);\n const client = createAdminClient(config);\n if (args.command === \"pull\") {\n await runPull({ client, schemaPath: config.schema, force: args.force });\n return 0;\n }\n const schemas = await loadSchemas(config.schema);\n if (args.command === \"diff\") {\n await runDiff({ client, schemas });\n return 0;\n }\n if (args.command === \"push\") {\n const result = await runPush({ client, schemas, allowDestructive: args.allowDestructive });\n return result.ok ? 0 : 2;\n }\n console.error(`Unknown command: ${args.command}`);\n console.log(HELP);\n return 1;\n } catch (err) {\n if (err instanceof SyncTransportError) console.error(`Sync failed: Shopify rejected a request.`);\n else console.error(err instanceof Error ? err.message : String(err));\n return 1;\n }\n}\n\n// Invoked as the bin. Guarded so importing this module in tests (which read\n// `parseArgs`) does not trigger process.exit — vitest sets process.env.VITEST.\nif (process.env.VITEST === undefined) {\n main(process.argv.slice(2)).then((code) => process.exit(code));\n}\n"],"mappings":"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","names":["existsSync","mkdirSync","writeFileSync","dirname","resolve","resolve","existsSync","mkdirSync","dirname","writeFileSync"]}
@@ -0,0 +1,25 @@
1
+ /**
2
+ * The minimal Admin GraphQL transport the sync adapter depends on. The app
3
+ * supplies a concrete implementation at its edge (wrapping `admin.graphql`),
4
+ * keeping `@fmaplabs/meta-manifest` free of any runtime dependency on a GraphQL
5
+ * client. [design §5]
6
+ */
7
+ interface AdminGraphQLClient {
8
+ (query: string, options?: {
9
+ variables?: Record<string, unknown>;
10
+ }): Promise<{
11
+ data?: unknown;
12
+ errors?: unknown;
13
+ }>;
14
+ }
15
+ /**
16
+ * Thrown when a request fails at the transport or top-level GraphQL layer —
17
+ * distinct from per-op `userErrors`, which `push` reports as `failed` rather
18
+ * than throwing. Carries the offending top-level `errors` payload. [design §5]
19
+ */
20
+ declare class SyncTransportError extends Error {
21
+ readonly errors: unknown;
22
+ constructor(message: string, errors: unknown);
23
+ }
24
+
25
+ export { type AdminGraphQLClient as A, SyncTransportError as S };
@@ -0,0 +1,25 @@
1
+ /**
2
+ * The minimal Admin GraphQL transport the sync adapter depends on. The app
3
+ * supplies a concrete implementation at its edge (wrapping `admin.graphql`),
4
+ * keeping `@fmaplabs/meta-manifest` free of any runtime dependency on a GraphQL
5
+ * client. [design §5]
6
+ */
7
+ interface AdminGraphQLClient {
8
+ (query: string, options?: {
9
+ variables?: Record<string, unknown>;
10
+ }): Promise<{
11
+ data?: unknown;
12
+ errors?: unknown;
13
+ }>;
14
+ }
15
+ /**
16
+ * Thrown when a request fails at the transport or top-level GraphQL layer —
17
+ * distinct from per-op `userErrors`, which `push` reports as `failed` rather
18
+ * than throwing. Carries the offending top-level `errors` payload. [design §5]
19
+ */
20
+ declare class SyncTransportError extends Error {
21
+ readonly errors: unknown;
22
+ constructor(message: string, errors: unknown);
23
+ }
24
+
25
+ export { type AdminGraphQLClient as A, SyncTransportError as S };