@stacksjs/browser-extension 0.70.260 → 0.70.262

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/dist/safari.d.ts CHANGED
@@ -49,6 +49,33 @@ export declare function buildSafariUniversalApp(config: ExtensionConfig, options
49
49
  export declare function buildSafariApp(config: ExtensionConfig, options?: SafariAppBuildOptions): Promise<{ appPath?: string, resources: string }>;
50
50
  /** Resolve and validate App Store Connect credentials from options or environment variables. */
51
51
  export declare function resolveAppStoreConnectAuth(options: AppStoreConnectAuth): Required<AppStoreConnectAuth>;
52
+ /**
53
+ * Signing settings for the *archive* step. The export below is what signs for
54
+ * real, through App Store Connect with the API key, so neither platform needs a
55
+ * developer identity here — but "needs no identity" is not the same as "skip
56
+ * signing", and the difference cost us every macOS upload for two days.
57
+ *
58
+ * iOS archives with signing off outright: a development-signed device archive
59
+ * needs a registered UDID, and iOS has no entitlement that the export cannot
60
+ * supply for itself.
61
+ *
62
+ * macOS ad-hoc signs instead. Turning signing off entirely (which is what this
63
+ * used to do) also skips entitlement processing, so the archived app and appex
64
+ * carried no `com.apple.security.app-sandbox`; `-exportArchive` re-signs from
65
+ * whatever the archive holds, so it had none to preserve, and App Store Connect
66
+ * rejected every macOS build with "App sandbox not enabled". The `-` identity
67
+ * is local and costs nothing — entitlements get embedded, no certificate is
68
+ * requested from Apple, and the export re-signs over the top.
69
+ *
70
+ * Not signing at all was itself a fix, for a real problem: `xcodeAuthArgs`
71
+ * passes `-allowProvisioningUpdates` with an API key, so on a CI runner whose
72
+ * keychain starts empty every run, Xcode asked Apple for a *new* Mac
73
+ * Development certificate, used it once, and threw the machine away. Enough
74
+ * releases and the team hits Apple's certificate cap. Ad-hoc signing keeps that
75
+ * fixed: `Manual` style with an explicit empty profile is what stops Xcode
76
+ * reaching for a certificate, so all three settings have to travel together.
77
+ */
78
+ export declare function archiveSigningArgs(platform: SafariPlatform): string[];
52
79
  /**
53
80
  * Create a signed Release archive and either validate it or upload it to App
54
81
  * Store Connect. Xcode owns certificate/profile creation and the upload so the
package/dist/safari.js CHANGED
@@ -25,7 +25,7 @@ import{cpSync,existsSync,readdirSync,statSync}from"node:fs";import{mkdir,rm}from
25
25
  `),outputs=synced.map((rel)=>`$(TARGET_BUILD_DIR)/$(UNLOCALIZED_RESOURCES_FOLDER_PATH)/${rel}`).join(`
26
26
  `);await Bun.write(join(projectDir,`${appName} Extension`,"Resources.inputs.xcfilelist"),`${inputs}
27
27
  `);await Bun.write(join(projectDir,`${appName} Extension`,"Resources.outputs.xcfilelist"),`${outputs}
28
- `);return{resources,files:synced.length}}export async function createSafariUniversalProject(config,options={}){const cwd=options.cwd??process.cwd();if(options.build!==!1){if(!options.version)throw Error("[browser-extension] createSafariUniversalProject needs a version to build the extension");await buildExtension(config,{target:"safari",version:options.version,cwd})}const outdir=resolve(cwd,options.outdir??resolveOutdir(config,"safari"));if(!existsSync(join(outdir,"manifest.json")))throw Error(`[browser-extension] ${outdir}/manifest.json is missing. Run extension:build --target safari first.`);const appName=safariAppName(config),bundleId=config.safariBundleId;if(!bundleId)throw Error("[browser-extension] universal Safari packaging needs safariBundleId in config/extension.ts");const platforms=resolveSafariPlatforms(config,options.platforms);if(!platforms.length)throw Error("[browser-extension] universal Safari packaging needs at least one platform");const buildDir=join(safariProjectDir(cwd,options.dir),"build"),resources=join(buildDir,"universal-resources"),projectLocation=join(buildDir,"universal-project");await mirrorSafariResources(config,outdir,resources);await rm(projectLocation,{recursive:!0,force:!0});await mkdir(projectLocation,{recursive:!0});const args=safariPackagerArgs(resources,projectLocation,appName,bundleId,platforms),exitCode=await Bun.spawn(["xcrun",...args],{cwd,stdout:"inherit",stderr:"inherit"}).exited;if(exitCode!==0)throw Error(`[browser-extension] Safari web extension packager failed (${exitCode})`);const dir=join(projectLocation,appName),project=join(dir,`${appName}.xcodeproj`);if(!existsSync(project))throw Error(`[browser-extension] Safari packager did not create ${project}`);return{dir,project,resources,platforms}}export async function buildSafariUniversalApp(config,options={}){const generated=await createSafariUniversalProject(config,options),appPaths={};if(options.skipXcodebuild)return{...generated,appPaths};const appName=safariAppName(config),configuration=options.release?"Release":"Debug",derivedData=join(safariProjectDir(options.cwd??process.cwd(),options.dir),"build","universal-derived");await rm(derivedData,{recursive:!0,force:!0});for(const platform of generated.platforms){const ios=platform==="ios",args=["xcodebuild","-project",generated.project,"-scheme",`${appName} (${ios?"iOS":"macOS"})`,"-configuration",configuration,"-destination",ios?"generic/platform=iOS Simulator":"generic/platform=macOS","-derivedDataPath",derivedData,...ios?["-sdk","iphonesimulator","CODE_SIGNING_ALLOWED=NO"]:options.signed?["-allowProvisioningUpdates"]:["CODE_SIGNING_ALLOWED=NO"],"build"],exitCode=await Bun.spawn(args,{cwd:generated.dir,stdout:"inherit",stderr:"inherit"}).exited;if(exitCode!==0)throw Error(`[browser-extension] Safari ${platform} app build failed (${exitCode})`);const products=ios?`${configuration}-iphonesimulator`:configuration;appPaths[platform]=join(derivedData,"Build","Products",products,`${appName}.app`)}return{...generated,appPaths}}export async function buildSafariApp(config,options={}){const cwd=options.cwd??process.cwd();if(options.build!==!1){if(!options.version)throw Error("[browser-extension] buildSafariApp needs a version to build the extension");await buildExtension(config,{target:"safari",version:options.version,cwd})}const{resources}=await syncSafariResources(config,options);if(options.skipXcodebuild)return{resources};const appName=safariAppName(config),dir=safariProjectDir(cwd,options.dir),configuration=options.release?"Release":"Debug",derivedData=join(dir,"build"),developerDir=(process.env.DEVELOPER_DIR??(await Bun.$`xcode-select -p`.text()).trim()).replace(/\/$/,"");if(!developerDir.includes(".app/Contents/Developer")){console.error(`[browser-extension] full Xcode is required to build the app (active developer directory: ${developerDir}).`);console.error("Install Xcode, then: sudo xcode-select -s /Applications/Xcode.app/Contents/Developer");console.error("or point DEVELOPER_DIR at any Xcode toolchain (betas included) for this shell.");console.error(`The extension payload is built and synced at ${resources}`);return{resources}}const signing=options.signed?["-allowProvisioningUpdates"]:["CODE_SIGNING_ALLOWED=NO"];await Bun.$`xcodebuild -project ${join(dir,`${appName}.xcodeproj`)} -scheme ${appName} -configuration ${configuration} -derivedDataPath ${derivedData} ${signing} build`;return{appPath:join(derivedData,"Build","Products",configuration,`${appName}.app`),resources}}export function resolveAppStoreConnectAuth(options){const keyId=options.keyId??process.env.APP_STORE_CONNECT_API_KEY_ID,issuerId=options.issuerId??process.env.APP_STORE_CONNECT_API_ISSUER_ID,keyPath=options.keyPath??process.env.APP_STORE_CONNECT_API_KEY_PATH,missing=[!keyId&&"APP_STORE_CONNECT_API_KEY_ID",!issuerId&&"APP_STORE_CONNECT_API_ISSUER_ID",!keyPath&&"APP_STORE_CONNECT_API_KEY_PATH"].filter(Boolean);if(missing.length)throw Error(`[browser-extension] missing App Store Connect credentials: ${missing.join(", ")}`);if(!existsSync(resolve(keyPath)))throw Error(`[browser-extension] App Store Connect API key not found: ${resolve(keyPath)}`);return{keyId,issuerId,keyPath:resolve(keyPath)}}function xcodeAuthArgs(auth){return["-allowProvisioningUpdates","-authenticationKeyPath",auth.keyPath,"-authenticationKeyID",auth.keyId,"-authenticationKeyIssuerID",auth.issuerId]}async function runXcodebuild(args,cwd,operation){const exitCode=await Bun.spawn(["xcodebuild",...args],{cwd,stdout:"inherit",stderr:"inherit"}).exited;if(exitCode!==0)throw Error(`[browser-extension] ${operation} failed (${exitCode})`)}function exportOptionsPlist(method,teamId){return`<?xml version="1.0" encoding="UTF-8"?>
28
+ `);return{resources,files:synced.length}}export async function createSafariUniversalProject(config,options={}){const cwd=options.cwd??process.cwd();if(options.build!==!1){if(!options.version)throw Error("[browser-extension] createSafariUniversalProject needs a version to build the extension");await buildExtension(config,{target:"safari",version:options.version,cwd})}const outdir=resolve(cwd,options.outdir??resolveOutdir(config,"safari"));if(!existsSync(join(outdir,"manifest.json")))throw Error(`[browser-extension] ${outdir}/manifest.json is missing. Run extension:build --target safari first.`);const appName=safariAppName(config),bundleId=config.safariBundleId;if(!bundleId)throw Error("[browser-extension] universal Safari packaging needs safariBundleId in config/extension.ts");const platforms=resolveSafariPlatforms(config,options.platforms);if(!platforms.length)throw Error("[browser-extension] universal Safari packaging needs at least one platform");const buildDir=join(safariProjectDir(cwd,options.dir),"build"),resources=join(buildDir,"universal-resources"),projectLocation=join(buildDir,"universal-project");await mirrorSafariResources(config,outdir,resources);await rm(projectLocation,{recursive:!0,force:!0});await mkdir(projectLocation,{recursive:!0});const args=safariPackagerArgs(resources,projectLocation,appName,bundleId,platforms),exitCode=await Bun.spawn(["xcrun",...args],{cwd,stdout:"inherit",stderr:"inherit"}).exited;if(exitCode!==0)throw Error(`[browser-extension] Safari web extension packager failed (${exitCode})`);const dir=join(projectLocation,appName),project=join(dir,`${appName}.xcodeproj`);if(!existsSync(project))throw Error(`[browser-extension] Safari packager did not create ${project}`);return{dir,project,resources,platforms}}export async function buildSafariUniversalApp(config,options={}){const generated=await createSafariUniversalProject(config,options),appPaths={};if(options.skipXcodebuild)return{...generated,appPaths};const appName=safariAppName(config),configuration=options.release?"Release":"Debug",derivedData=join(safariProjectDir(options.cwd??process.cwd(),options.dir),"build","universal-derived");await rm(derivedData,{recursive:!0,force:!0});for(const platform of generated.platforms){const ios=platform==="ios",args=["xcodebuild","-project",generated.project,"-scheme",`${appName} (${ios?"iOS":"macOS"})`,"-configuration",configuration,"-destination",ios?"generic/platform=iOS Simulator":"generic/platform=macOS","-derivedDataPath",derivedData,...ios?["-sdk","iphonesimulator","CODE_SIGNING_ALLOWED=NO"]:options.signed?["-allowProvisioningUpdates"]:["CODE_SIGNING_ALLOWED=NO"],"build"],exitCode=await Bun.spawn(args,{cwd:generated.dir,stdout:"inherit",stderr:"inherit"}).exited;if(exitCode!==0)throw Error(`[browser-extension] Safari ${platform} app build failed (${exitCode})`);const products=ios?`${configuration}-iphonesimulator`:configuration;appPaths[platform]=join(derivedData,"Build","Products",products,`${appName}.app`)}return{...generated,appPaths}}export async function buildSafariApp(config,options={}){const cwd=options.cwd??process.cwd();if(options.build!==!1){if(!options.version)throw Error("[browser-extension] buildSafariApp needs a version to build the extension");await buildExtension(config,{target:"safari",version:options.version,cwd})}const{resources}=await syncSafariResources(config,options);if(options.skipXcodebuild)return{resources};const appName=safariAppName(config),dir=safariProjectDir(cwd,options.dir),configuration=options.release?"Release":"Debug",derivedData=join(dir,"build"),developerDir=(process.env.DEVELOPER_DIR??(await Bun.$`xcode-select -p`.text()).trim()).replace(/\/$/,"");if(!developerDir.includes(".app/Contents/Developer")){console.error(`[browser-extension] full Xcode is required to build the app (active developer directory: ${developerDir}).`);console.error("Install Xcode, then: sudo xcode-select -s /Applications/Xcode.app/Contents/Developer");console.error("or point DEVELOPER_DIR at any Xcode toolchain (betas included) for this shell.");console.error(`The extension payload is built and synced at ${resources}`);return{resources}}const signing=options.signed?["-allowProvisioningUpdates"]:["CODE_SIGNING_ALLOWED=NO"];await Bun.$`xcodebuild -project ${join(dir,`${appName}.xcodeproj`)} -scheme ${appName} -configuration ${configuration} -derivedDataPath ${derivedData} ${signing} build`;return{appPath:join(derivedData,"Build","Products",configuration,`${appName}.app`),resources}}export function resolveAppStoreConnectAuth(options){const keyId=options.keyId??process.env.APP_STORE_CONNECT_API_KEY_ID,issuerId=options.issuerId??process.env.APP_STORE_CONNECT_API_ISSUER_ID,keyPath=options.keyPath??process.env.APP_STORE_CONNECT_API_KEY_PATH,missing=[!keyId&&"APP_STORE_CONNECT_API_KEY_ID",!issuerId&&"APP_STORE_CONNECT_API_ISSUER_ID",!keyPath&&"APP_STORE_CONNECT_API_KEY_PATH"].filter(Boolean);if(missing.length)throw Error(`[browser-extension] missing App Store Connect credentials: ${missing.join(", ")}`);if(!existsSync(resolve(keyPath)))throw Error(`[browser-extension] App Store Connect API key not found: ${resolve(keyPath)}`);return{keyId,issuerId,keyPath:resolve(keyPath)}}function xcodeAuthArgs(auth){return["-allowProvisioningUpdates","-authenticationKeyPath",auth.keyPath,"-authenticationKeyID",auth.keyId,"-authenticationKeyIssuerID",auth.issuerId]}export function archiveSigningArgs(platform){if(platform==="ios")return["CODE_SIGNING_ALLOWED=NO"];return["CODE_SIGN_STYLE=Manual","CODE_SIGN_IDENTITY=-","PROVISIONING_PROFILE_SPECIFIER="]}async function runXcodebuild(args,cwd,operation){const exitCode=await Bun.spawn(["xcodebuild",...args],{cwd,stdout:"inherit",stderr:"inherit"}).exited;if(exitCode!==0)throw Error(`[browser-extension] ${operation} failed (${exitCode})`)}function exportOptionsPlist(method,teamId){return`<?xml version="1.0" encoding="UTF-8"?>
29
29
  <!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
30
30
  <plist version="1.0">
31
31
  <dict>
@@ -43,4 +43,4 @@ import{cpSync,existsSync,readdirSync,statSync}from"node:fs";import{mkdir,rm}from
43
43
  <true/>
44
44
  </dict>
45
45
  </plist>
46
- `}export async function publishSafariApp(config,options){const cwd=options.cwd??process.cwd(),teamId=options.teamId??config.safariTeamId;if(!teamId)throw Error("[browser-extension] Safari publishing needs safariTeamId in config/extension.ts or --team-id");const auth=resolveAppStoreConnectAuth(options),buildNumber=options.buildNumber??process.env.GITHUB_RUN_NUMBER??String(Math.floor(Date.now()/1000));if(!/^\d+(?:\.\d+){0,2}$/.test(buildNumber))throw Error(`[browser-extension] invalid Safari build number ${buildNumber}; use one to three dot-separated integers`);const platforms=resolveSafariPlatforms(config,options.platforms);if(!platforms.length)throw Error("[browser-extension] Safari publishing needs at least one platform");const{AppStoreConnectClient,attachSafariBuilds,provisionSafariApp}=await import("./app-store-connect"),provisioned=await provisionSafariApp(config,{...auth,version:options.validateOnly?void 0:options.version,platforms});if(!provisioned.appRecord.exists)throw Error("[browser-extension] the App Store Connect app record is missing; create it once in App Store Connect before publishing");const publishablePlatforms=options.validateOnly?platforms:platforms.filter((platform)=>provisioned.appStoreVersions.some((version)=>version.platform===platform&&version.status!=="deferred"&&version.status!=="published")),deferred=provisioned.appStoreVersions.filter((version)=>version.status==="deferred").map((version)=>({platform:version.platform,version:version.version,state:version.appStoreState,reason:version.reason??`Safari ${version.platform} publication is deferred`})),alreadyPublished=provisioned.appStoreVersions.filter((version)=>version.status==="published").map((version)=>({platform:version.platform,version:version.version,state:version.appStoreState}));if(!publishablePlatforms.length)return{archivePath:"",exportPath:"",buildNumber,artifacts:[],attachments:[],deferred,alreadyPublished};if(options.build!==!1)await buildExtension(config,{target:"safari",version:options.version,cwd});const appName=safariAppName(config),dir=safariProjectDir(cwd,options.dir),buildDir=join(dir,"build"),universal=publishablePlatforms.includes("ios");let project,projectCwd;if(universal){const generated=await createSafariUniversalProject(config,{...options,build:!1,platforms:publishablePlatforms});project=generated.project;projectCwd=generated.dir}else{await syncSafariResources(config,options);project=join(dir,`${appName}.xcodeproj`);projectCwd=dir}const authArgs=xcodeAuthArgs(auth);await mkdir(buildDir,{recursive:!0});const method=options.validateOnly?"validation":"app-store-connect",artifacts=[];for(const platform of publishablePlatforms){const suffix=universal?`-${platform}`:"",archivePath=join(buildDir,`${appName}${suffix}.xcarchive`),exportPath=join(buildDir,`${options.validateOnly?"validation":"upload"}${suffix}`),plistPath=join(buildDir,`ExportOptions.${method}${suffix}.plist`),scheme=universal?`${appName} (${platform==="ios"?"iOS":"macOS"})`:appName,destination=platform==="ios"?"generic/platform=iOS":"generic/platform=macOS";await rm(archivePath,{recursive:!0,force:!0});await rm(exportPath,{recursive:!0,force:!0});await runXcodebuild(["-project",project,"-scheme",scheme,"-configuration","Release","-destination",destination,"-archivePath",archivePath,`MARKETING_VERSION=${options.version}`,`CURRENT_PROJECT_VERSION=${buildNumber}`,`DEVELOPMENT_TEAM=${teamId}`,"INFOPLIST_KEY_ITSAppUsesNonExemptEncryption=NO","CODE_SIGNING_ALLOWED=NO",...platform==="macos"&&config.safariAppCategory?[`INFOPLIST_KEY_LSApplicationCategoryType=${config.safariAppCategory}`]:[],...authArgs,"archive"],projectCwd,`Safari ${platform} archive`);await Bun.write(plistPath,exportOptionsPlist(method,teamId));await runXcodebuild(["-exportArchive","-archivePath",archivePath,"-exportPath",exportPath,"-exportOptionsPlist",plistPath,...authArgs],projectCwd,`Safari ${platform} export`);artifacts.push({platform,archivePath,exportPath})}const attachments=options.validateOnly?[]:await attachSafariBuilds(new AppStoreConnectClient(auth),provisioned.appRecord.id,provisioned.appStoreVersions.filter((version)=>version.status!=="deferred"&&version.status!=="published"),buildNumber,{timeoutMs:options.processingTimeoutMs,pollIntervalMs:options.processingPollIntervalMs}),appStoreSubmission=!options.validateOnly&&config.safariAppStore?await(await import("./app-store-submission")).prepareSafariAppStoreSubmission(new AppStoreConnectClient(auth),config,provisioned.appRecord.id,attachments.map((attachment)=>({platform:attachment.platform,id:attachment.versionId,buildId:attachment.buildId})),{cwd}):void 0,firstArtifact=artifacts[0];return{archivePath:firstArtifact.archivePath,exportPath:firstArtifact.exportPath,buildNumber,artifacts,deferred,alreadyPublished,attachments,appStoreSubmission:appStoreSubmission?{versions:appStoreSubmission.versions,reviewSubmissionIds:appStoreSubmission.reviewSubmissionIds}:void 0}}
46
+ `}export async function publishSafariApp(config,options){const cwd=options.cwd??process.cwd(),teamId=options.teamId??config.safariTeamId;if(!teamId)throw Error("[browser-extension] Safari publishing needs safariTeamId in config/extension.ts or --team-id");const auth=resolveAppStoreConnectAuth(options),buildNumber=options.buildNumber??process.env.GITHUB_RUN_NUMBER??String(Math.floor(Date.now()/1000));if(!/^\d+(?:\.\d+){0,2}$/.test(buildNumber))throw Error(`[browser-extension] invalid Safari build number ${buildNumber}; use one to three dot-separated integers`);const platforms=resolveSafariPlatforms(config,options.platforms);if(!platforms.length)throw Error("[browser-extension] Safari publishing needs at least one platform");const{AppStoreConnectClient,attachSafariBuilds,provisionSafariApp}=await import("./app-store-connect"),provisioned=await provisionSafariApp(config,{...auth,version:options.validateOnly?void 0:options.version,platforms});if(!provisioned.appRecord.exists)throw Error("[browser-extension] the App Store Connect app record is missing; create it once in App Store Connect before publishing");const publishablePlatforms=options.validateOnly?platforms:platforms.filter((platform)=>provisioned.appStoreVersions.some((version)=>version.platform===platform&&version.status!=="deferred"&&version.status!=="published")),deferred=provisioned.appStoreVersions.filter((version)=>version.status==="deferred").map((version)=>({platform:version.platform,version:version.version,state:version.appStoreState,reason:version.reason??`Safari ${version.platform} publication is deferred`})),alreadyPublished=provisioned.appStoreVersions.filter((version)=>version.status==="published").map((version)=>({platform:version.platform,version:version.version,state:version.appStoreState}));if(!publishablePlatforms.length)return{archivePath:"",exportPath:"",buildNumber,artifacts:[],attachments:[],deferred,alreadyPublished};if(options.build!==!1)await buildExtension(config,{target:"safari",version:options.version,cwd});const appName=safariAppName(config),dir=safariProjectDir(cwd,options.dir),buildDir=join(dir,"build"),universal=publishablePlatforms.includes("ios");let project,projectCwd;if(universal){const generated=await createSafariUniversalProject(config,{...options,build:!1,platforms:publishablePlatforms});project=generated.project;projectCwd=generated.dir}else{await syncSafariResources(config,options);project=join(dir,`${appName}.xcodeproj`);projectCwd=dir}const authArgs=xcodeAuthArgs(auth);await mkdir(buildDir,{recursive:!0});const method=options.validateOnly?"validation":"app-store-connect",artifacts=[];for(const platform of publishablePlatforms){const suffix=universal?`-${platform}`:"",archivePath=join(buildDir,`${appName}${suffix}.xcarchive`),exportPath=join(buildDir,`${options.validateOnly?"validation":"upload"}${suffix}`),plistPath=join(buildDir,`ExportOptions.${method}${suffix}.plist`),scheme=universal?`${appName} (${platform==="ios"?"iOS":"macOS"})`:appName,destination=platform==="ios"?"generic/platform=iOS":"generic/platform=macOS";await rm(archivePath,{recursive:!0,force:!0});await rm(exportPath,{recursive:!0,force:!0});await runXcodebuild(["-project",project,"-scheme",scheme,"-configuration","Release","-destination",destination,"-archivePath",archivePath,`MARKETING_VERSION=${options.version}`,`CURRENT_PROJECT_VERSION=${buildNumber}`,`DEVELOPMENT_TEAM=${teamId}`,"INFOPLIST_KEY_ITSAppUsesNonExemptEncryption=NO",...archiveSigningArgs(platform),...platform==="macos"&&config.safariAppCategory?[`INFOPLIST_KEY_LSApplicationCategoryType=${config.safariAppCategory}`]:[],...authArgs,"archive"],projectCwd,`Safari ${platform} archive`);await Bun.write(plistPath,exportOptionsPlist(method,teamId));await runXcodebuild(["-exportArchive","-archivePath",archivePath,"-exportPath",exportPath,"-exportOptionsPlist",plistPath,...authArgs],projectCwd,`Safari ${platform} export`);artifacts.push({platform,archivePath,exportPath})}const attachments=options.validateOnly?[]:await attachSafariBuilds(new AppStoreConnectClient(auth),provisioned.appRecord.id,provisioned.appStoreVersions.filter((version)=>version.status!=="deferred"&&version.status!=="published"),buildNumber,{timeoutMs:options.processingTimeoutMs,pollIntervalMs:options.processingPollIntervalMs}),appStoreSubmission=!options.validateOnly&&config.safariAppStore?await(await import("./app-store-submission")).prepareSafariAppStoreSubmission(new AppStoreConnectClient(auth),config,provisioned.appRecord.id,attachments.map((attachment)=>({platform:attachment.platform,id:attachment.versionId,buildId:attachment.buildId})),{cwd}):void 0,firstArtifact=artifacts[0];return{archivePath:firstArtifact.archivePath,exportPath:firstArtifact.exportPath,buildNumber,artifacts,deferred,alreadyPublished,attachments,appStoreSubmission:appStoreSubmission?{versions:appStoreSubmission.versions,reviewSubmissionIds:appStoreSubmission.reviewSubmissionIds}:void 0}}
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@stacksjs/browser-extension",
3
3
  "type": "module",
4
- "version": "0.70.260",
4
+ "version": "0.70.262",
5
5
  "description": "Build MV3 browser extensions (Chrome, Firefox, Safari) the Stacks way — manifest, content/background scripts, DNR rules, packaging, Safari container app, all config-driven.",
6
6
  "author": "Chris Breuer",
7
7
  "contributors": [