@aexol/opencode-wizard 0.1.14 → 0.1.16
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +2 -1
- package/dist/config.d.ts +6 -0
- package/dist/config.js +19 -0
- package/dist/config.js.map +1 -0
- package/dist/server.d.ts +49 -2
- package/dist/server.js +448 -97
- package/dist/server.js.map +1 -1
- package/dist/smoke-published-skills.js +7 -1
- package/dist/smoke-published-skills.js.map +1 -1
- package/dist/storage.d.ts +5 -0
- package/dist/storage.js +43 -0
- package/dist/storage.js.map +1 -0
- package/dist/tui.js +414 -186
- package/dist/tui.js.map +1 -1
- package/package.json +3 -2
|
@@ -108,7 +108,13 @@ const run = async () => {
|
|
|
108
108
|
checksum: 'checksum-1',
|
|
109
109
|
publishedAt: '2026-04-22T00:00:00.000Z'
|
|
110
110
|
}
|
|
111
|
-
}]
|
|
111
|
+
}],
|
|
112
|
+
catalogSkills: [],
|
|
113
|
+
userPreferences: {
|
|
114
|
+
scopeKey: 'workspace:workspace-1',
|
|
115
|
+
userKey: 'user-1',
|
|
116
|
+
ignoredSkills: []
|
|
117
|
+
}
|
|
112
118
|
};
|
|
113
119
|
const detailItem = {
|
|
114
120
|
...payload.skills[0],
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":["buildSkillMarkdown","resolveConfig","selectPublishedSkills","toPublishedSkillCatalog","toPublishedSkillDetail","fs","os","path","DEPLOY_BACKEND_ORIGIN","LOCAL_OVERRIDE_BACKEND_ORIGIN","BACKEND_ENV_KEYS","withBackendEnv","env","callback","previousValues","Map","key","set","process","value","Object","entries","undefined","assertBackendOriginResolution","isolatedWorktree","mkdtemp","join","tmpdir","defaultConfig","backendOrigin","Error","portOnlyConfig","PORT","appUrlPlaceholderConfig","APP_URL","overrideConfig","OPENCODE_WIZARD_BACKEND_ORIGIN","defaultBackendOrigin","portOnlyBackendOrigin","appUrlPlaceholderBackendOrigin","explicitOverrideBackendOrigin","run","payload","workspace","id","slug","name","repositoryUrl","defaultBranch","status","directoryPath","skills","assignmentSource","assignmentType","scopePath","includeChildren","skill","summary","whenToUse","installPolicy","tags","label","description","facet","skillVersion","version","title","publishedArtifact","frontmatterName","frontmatterDescription","checksum","publishedAt","detailItem","markdownBody","renderedContent","config","cwd","backendOriginSmoke","catalog","selection","detail","selectedItems","preview","split","slice","console","log","JSON","stringify","runtimeMode","graphqlUrl","publishedSkillCount","availableTools","facets","selectedSkillCount","length","missingSkills","missingIdentifiers","selectedSkillSlug","skillSlug","selectedSkillTags","markdownDocumentIncludesFrontmatter","markdownDocument","startsWith","markdownBodyIncludesContent","includes"],"sources":["../src/smoke-published-skills.ts"],"sourcesContent":["import {\n buildSkillMarkdown,\n resolveConfig,\n selectPublishedSkills,\n toPublishedSkillCatalog,\n toPublishedSkillDetail,\n type PublishedSkillCatalogPayload,\n type PublishedSkillDetailItem,\n} from './server.js';\nimport fs from 'node:fs/promises';\nimport os from 'node:os';\nimport path from 'node:path';\n\nconst DEPLOY_BACKEND_ORIGIN = 'https://opencode-wizard.aexol.work';\nconst LOCAL_OVERRIDE_BACKEND_ORIGIN = 'http://localhost:19876';\n\ntype BackendEnvKey = 'OPENCODE_WIZARD_BACKEND_ORIGIN' | 'APP_URL' | 'PORT';\n\nconst BACKEND_ENV_KEYS: BackendEnvKey[] = ['OPENCODE_WIZARD_BACKEND_ORIGIN', 'APP_URL', 'PORT'];\n\nconst withBackendEnv = async <TResult>(\n env: Partial<Record<BackendEnvKey, string>>,\n callback: () => Promise<TResult>,\n): Promise<TResult> => {\n const previousValues = new Map<BackendEnvKey, string | undefined>();\n\n for (const key of BACKEND_ENV_KEYS) {\n previousValues.set(key, process.env[key]);\n delete process.env[key];\n }\n\n for (const [key, value] of Object.entries(env)) {\n process.env[key as BackendEnvKey] = value;\n }\n\n try {\n return await callback();\n } finally {\n for (const [key, value] of previousValues) {\n if (value === undefined) {\n delete process.env[key];\n continue;\n }\n\n process.env[key] = value;\n }\n }\n};\n\nconst assertBackendOriginResolution = async () => {\n const isolatedWorktree = await fs.mkdtemp(path.join(os.tmpdir(), 'opencode-wizard-plugin-smoke-'));\n\n const defaultConfig = await withBackendEnv({}, () => resolveConfig(isolatedWorktree));\n if (defaultConfig.backendOrigin !== DEPLOY_BACKEND_ORIGIN) {\n throw new Error(`Expected default backend origin ${DEPLOY_BACKEND_ORIGIN}, received ${defaultConfig.backendOrigin}`);\n }\n\n const portOnlyConfig = await withBackendEnv({ PORT: '19876' }, () => resolveConfig(isolatedWorktree));\n if (portOnlyConfig.backendOrigin !== DEPLOY_BACKEND_ORIGIN) {\n throw new Error(`Expected PORT-only backend origin to stay ${DEPLOY_BACKEND_ORIGIN}, received ${portOnlyConfig.backendOrigin}`);\n }\n\n const appUrlPlaceholderConfig = await withBackendEnv({ APP_URL: 'https://yourdomain.com' }, () =>\n resolveConfig(isolatedWorktree),\n );\n if (appUrlPlaceholderConfig.backendOrigin !== DEPLOY_BACKEND_ORIGIN) {\n throw new Error(\n `Expected APP_URL placeholder backend origin to stay ${DEPLOY_BACKEND_ORIGIN}, received ${appUrlPlaceholderConfig.backendOrigin}`,\n );\n }\n\n const overrideConfig = await withBackendEnv({ OPENCODE_WIZARD_BACKEND_ORIGIN: LOCAL_OVERRIDE_BACKEND_ORIGIN }, () =>\n resolveConfig(isolatedWorktree),\n );\n if (overrideConfig.backendOrigin !== LOCAL_OVERRIDE_BACKEND_ORIGIN) {\n throw new Error(`Expected explicit backend override ${LOCAL_OVERRIDE_BACKEND_ORIGIN}, received ${overrideConfig.backendOrigin}`);\n }\n\n return {\n defaultBackendOrigin: defaultConfig.backendOrigin,\n portOnlyBackendOrigin: portOnlyConfig.backendOrigin,\n appUrlPlaceholderBackendOrigin: appUrlPlaceholderConfig.backendOrigin,\n explicitOverrideBackendOrigin: overrideConfig.backendOrigin,\n };\n};\n\nconst run = async () => {\n const payload: PublishedSkillCatalogPayload = {\n workspace: {\n id: 'workspace-1',\n slug: 'opencode-wizard',\n name: 'opencode-wizard',\n repositoryUrl: 'https://example.com/opencode-wizard.git',\n defaultBranch: 'main',\n status: 'ACTIVE',\n },\n directoryPath: '.',\n skills: [\n {\n assignmentSource: 'WORKSPACE',\n assignmentType: 'PATH',\n scopePath: '.',\n includeChildren: true,\n skill: {\n id: 'skill-1',\n slug: 'backend-auth',\n name: 'backend-auth',\n summary: 'Backend auth skill',\n whenToUse: 'Use for JWT cookie sessions and protected backend resolver work.',\n status: 'ACTIVE',\n installPolicy: 'PROJECT_INSTALLABLE',\n tags: [\n {\n id: 'tag-1',\n slug: 'auth',\n label: 'Auth',\n description: null,\n facet: {\n id: 'facet-1',\n slug: 'capability',\n label: 'Capability',\n description: null,\n },\n },\n ],\n },\n skillVersion: {\n id: 'version-1',\n version: '1.0.0',\n title: 'Initial',\n summary: 'Initial publish',\n status: 'PUBLISHED',\n },\n publishedArtifact: {\n id: 'artifact-1',\n frontmatterName: 'backend-auth',\n frontmatterDescription: 'JWT auth skill',\n checksum: 'checksum-1',\n publishedAt: '2026-04-22T00:00:00.000Z',\n },\n },\n ],\n };\n const detailItem: PublishedSkillDetailItem = {\n ...payload.skills[0],\n publishedArtifact: {\n ...payload.skills[0].publishedArtifact,\n markdownBody: '## Mock skill\\n\\nThis is a mock published skill.',\n renderedContent: '<h2>Mock skill</h2>',\n },\n };\n\n const config = await resolveConfig(process.cwd());\n const backendOriginSmoke = await assertBackendOriginResolution();\n\n const catalog = toPublishedSkillCatalog(payload);\n const selection = selectPublishedSkills(payload, ['backend-auth', 'missing-skill']);\n const detail = selection.selectedItems[0] ? toPublishedSkillDetail(detailItem) : null;\n const preview = buildSkillMarkdown(detailItem).split('\\n').slice(0, 6);\n\n console.log(\n JSON.stringify(\n {\n runtimeMode: catalog.runtimeMode,\n graphqlUrl: config.graphqlUrl,\n backendOriginSmoke,\n publishedSkillCount: catalog.publishedSkillCount,\n availableTools: catalog.availableTools,\n facets: catalog.facets,\n selectedSkillCount: selection.selectedItems.length,\n missingSkills: selection.missingIdentifiers,\n selectedSkillSlug: detail?.skillSlug ?? null,\n selectedSkillTags: detail?.tags ?? [],\n markdownDocumentIncludesFrontmatter: detail?.markdownDocument.startsWith('---') ?? false,\n preview,\n markdownBodyIncludesContent: detail?.markdownBody.includes('This is a mock published skill.') ?? false,\n },\n null,\n 2,\n ),\n );\n};\n\nvoid run();\n"],"mappings":"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","ignoreList":[]}
|
|
1
|
+
{"version":3,"names":["buildSkillMarkdown","resolveConfig","selectPublishedSkills","toPublishedSkillCatalog","toPublishedSkillDetail","fs","os","path","DEPLOY_BACKEND_ORIGIN","LOCAL_OVERRIDE_BACKEND_ORIGIN","BACKEND_ENV_KEYS","withBackendEnv","env","callback","previousValues","Map","key","set","process","value","Object","entries","undefined","assertBackendOriginResolution","isolatedWorktree","mkdtemp","join","tmpdir","defaultConfig","backendOrigin","Error","portOnlyConfig","PORT","appUrlPlaceholderConfig","APP_URL","overrideConfig","OPENCODE_WIZARD_BACKEND_ORIGIN","defaultBackendOrigin","portOnlyBackendOrigin","appUrlPlaceholderBackendOrigin","explicitOverrideBackendOrigin","run","payload","workspace","id","slug","name","repositoryUrl","defaultBranch","status","directoryPath","skills","assignmentSource","assignmentType","scopePath","includeChildren","skill","summary","whenToUse","installPolicy","tags","label","description","facet","skillVersion","version","title","publishedArtifact","frontmatterName","frontmatterDescription","checksum","publishedAt","catalogSkills","userPreferences","scopeKey","userKey","ignoredSkills","detailItem","markdownBody","renderedContent","config","cwd","backendOriginSmoke","catalog","selection","detail","selectedItems","preview","split","slice","console","log","JSON","stringify","runtimeMode","graphqlUrl","publishedSkillCount","availableTools","facets","selectedSkillCount","length","missingSkills","missingIdentifiers","selectedSkillSlug","skillSlug","selectedSkillTags","markdownDocumentIncludesFrontmatter","markdownDocument","startsWith","markdownBodyIncludesContent","includes"],"sources":["../src/smoke-published-skills.ts"],"sourcesContent":["import {\n buildSkillMarkdown,\n resolveConfig,\n selectPublishedSkills,\n toPublishedSkillCatalog,\n toPublishedSkillDetail,\n type PublishedSkillCatalogPayload,\n type PublishedSkillDetailItem,\n} from './server.js';\nimport fs from 'node:fs/promises';\nimport os from 'node:os';\nimport path from 'node:path';\n\nconst DEPLOY_BACKEND_ORIGIN = 'https://opencode-wizard.aexol.work';\nconst LOCAL_OVERRIDE_BACKEND_ORIGIN = 'http://localhost:19876';\n\ntype BackendEnvKey = 'OPENCODE_WIZARD_BACKEND_ORIGIN' | 'APP_URL' | 'PORT';\n\nconst BACKEND_ENV_KEYS: BackendEnvKey[] = ['OPENCODE_WIZARD_BACKEND_ORIGIN', 'APP_URL', 'PORT'];\n\nconst withBackendEnv = async <TResult>(\n env: Partial<Record<BackendEnvKey, string>>,\n callback: () => Promise<TResult>,\n): Promise<TResult> => {\n const previousValues = new Map<BackendEnvKey, string | undefined>();\n\n for (const key of BACKEND_ENV_KEYS) {\n previousValues.set(key, process.env[key]);\n delete process.env[key];\n }\n\n for (const [key, value] of Object.entries(env)) {\n process.env[key as BackendEnvKey] = value;\n }\n\n try {\n return await callback();\n } finally {\n for (const [key, value] of previousValues) {\n if (value === undefined) {\n delete process.env[key];\n continue;\n }\n\n process.env[key] = value;\n }\n }\n};\n\nconst assertBackendOriginResolution = async () => {\n const isolatedWorktree = await fs.mkdtemp(path.join(os.tmpdir(), 'opencode-wizard-plugin-smoke-'));\n\n const defaultConfig = await withBackendEnv({}, () => resolveConfig(isolatedWorktree));\n if (defaultConfig.backendOrigin !== DEPLOY_BACKEND_ORIGIN) {\n throw new Error(`Expected default backend origin ${DEPLOY_BACKEND_ORIGIN}, received ${defaultConfig.backendOrigin}`);\n }\n\n const portOnlyConfig = await withBackendEnv({ PORT: '19876' }, () => resolveConfig(isolatedWorktree));\n if (portOnlyConfig.backendOrigin !== DEPLOY_BACKEND_ORIGIN) {\n throw new Error(`Expected PORT-only backend origin to stay ${DEPLOY_BACKEND_ORIGIN}, received ${portOnlyConfig.backendOrigin}`);\n }\n\n const appUrlPlaceholderConfig = await withBackendEnv({ APP_URL: 'https://yourdomain.com' }, () =>\n resolveConfig(isolatedWorktree),\n );\n if (appUrlPlaceholderConfig.backendOrigin !== DEPLOY_BACKEND_ORIGIN) {\n throw new Error(\n `Expected APP_URL placeholder backend origin to stay ${DEPLOY_BACKEND_ORIGIN}, received ${appUrlPlaceholderConfig.backendOrigin}`,\n );\n }\n\n const overrideConfig = await withBackendEnv({ OPENCODE_WIZARD_BACKEND_ORIGIN: LOCAL_OVERRIDE_BACKEND_ORIGIN }, () =>\n resolveConfig(isolatedWorktree),\n );\n if (overrideConfig.backendOrigin !== LOCAL_OVERRIDE_BACKEND_ORIGIN) {\n throw new Error(`Expected explicit backend override ${LOCAL_OVERRIDE_BACKEND_ORIGIN}, received ${overrideConfig.backendOrigin}`);\n }\n\n return {\n defaultBackendOrigin: defaultConfig.backendOrigin,\n portOnlyBackendOrigin: portOnlyConfig.backendOrigin,\n appUrlPlaceholderBackendOrigin: appUrlPlaceholderConfig.backendOrigin,\n explicitOverrideBackendOrigin: overrideConfig.backendOrigin,\n };\n};\n\nconst run = async () => {\n const payload: PublishedSkillCatalogPayload = {\n workspace: {\n id: 'workspace-1',\n slug: 'opencode-wizard',\n name: 'opencode-wizard',\n repositoryUrl: 'https://example.com/opencode-wizard.git',\n defaultBranch: 'main',\n status: 'ACTIVE',\n },\n directoryPath: '.',\n skills: [\n {\n assignmentSource: 'WORKSPACE',\n assignmentType: 'PATH',\n scopePath: '.',\n includeChildren: true,\n skill: {\n id: 'skill-1',\n slug: 'backend-auth',\n name: 'backend-auth',\n summary: 'Backend auth skill',\n whenToUse: 'Use for JWT cookie sessions and protected backend resolver work.',\n status: 'ACTIVE',\n installPolicy: 'PROJECT_INSTALLABLE',\n tags: [\n {\n id: 'tag-1',\n slug: 'auth',\n label: 'Auth',\n description: null,\n facet: {\n id: 'facet-1',\n slug: 'capability',\n label: 'Capability',\n description: null,\n },\n },\n ],\n },\n skillVersion: {\n id: 'version-1',\n version: '1.0.0',\n title: 'Initial',\n summary: 'Initial publish',\n status: 'PUBLISHED',\n },\n publishedArtifact: {\n id: 'artifact-1',\n frontmatterName: 'backend-auth',\n frontmatterDescription: 'JWT auth skill',\n checksum: 'checksum-1',\n publishedAt: '2026-04-22T00:00:00.000Z',\n },\n },\n ],\n catalogSkills: [],\n userPreferences: {\n scopeKey: 'workspace:workspace-1',\n userKey: 'user-1',\n ignoredSkills: [],\n },\n };\n const detailItem: PublishedSkillDetailItem = {\n ...payload.skills[0],\n publishedArtifact: {\n ...payload.skills[0].publishedArtifact,\n markdownBody: '## Mock skill\\n\\nThis is a mock published skill.',\n renderedContent: '<h2>Mock skill</h2>',\n },\n };\n\n const config = await resolveConfig(process.cwd());\n const backendOriginSmoke = await assertBackendOriginResolution();\n\n const catalog = toPublishedSkillCatalog(payload);\n const selection = selectPublishedSkills(payload, ['backend-auth', 'missing-skill']);\n const detail = selection.selectedItems[0] ? toPublishedSkillDetail(detailItem) : null;\n const preview = buildSkillMarkdown(detailItem).split('\\n').slice(0, 6);\n\n console.log(\n JSON.stringify(\n {\n runtimeMode: catalog.runtimeMode,\n graphqlUrl: config.graphqlUrl,\n backendOriginSmoke,\n publishedSkillCount: catalog.publishedSkillCount,\n availableTools: catalog.availableTools,\n facets: catalog.facets,\n selectedSkillCount: selection.selectedItems.length,\n missingSkills: selection.missingIdentifiers,\n selectedSkillSlug: detail?.skillSlug ?? null,\n selectedSkillTags: detail?.tags ?? [],\n markdownDocumentIncludesFrontmatter: detail?.markdownDocument.startsWith('---') ?? false,\n preview,\n markdownBodyIncludesContent: detail?.markdownBody.includes('This is a mock published skill.') ?? false,\n },\n null,\n 2,\n ),\n );\n};\n\nvoid run();\n"],"mappings":"AAAA,SACEA,kBAAkB,EAClBC,aAAa,EACbC,qBAAqB,EACrBC,uBAAuB,EACvBC,sBAAsB,QAGjB,aAAa;AACpB,OAAOC,EAAE,MAAM,kBAAkB;AACjC,OAAOC,EAAE,MAAM,SAAS;AACxB,OAAOC,IAAI,MAAM,WAAW;AAE5B,MAAMC,qBAAqB,GAAG,oCAAoC;AAClE,MAAMC,6BAA6B,GAAG,wBAAwB;AAI9D,MAAMC,gBAAiC,GAAG,CAAC,gCAAgC,EAAE,SAAS,EAAE,MAAM,CAAC;AAE/F,MAAMC,cAAc,GAAG,MAAAA,CACrBC,GAA2C,EAC3CC,QAAgC,KACX;EACrB,MAAMC,cAAc,GAAG,IAAIC,GAAG,CAAoC,CAAC;EAEnE,KAAK,MAAMC,GAAG,IAAIN,gBAAgB,EAAE;IAClCI,cAAc,CAACG,GAAG,CAACD,GAAG,EAAEE,OAAO,CAACN,GAAG,CAACI,GAAG,CAAC,CAAC;IACzC,OAAOE,OAAO,CAACN,GAAG,CAACI,GAAG,CAAC;EACzB;EAEA,KAAK,MAAM,CAACA,GAAG,EAAEG,KAAK,CAAC,IAAIC,MAAM,CAACC,OAAO,CAACT,GAAG,CAAC,EAAE;IAC9CM,OAAO,CAACN,GAAG,CAACI,GAAG,CAAkB,GAAGG,KAAK;EAC3C;EAEA,IAAI;IACF,OAAO,MAAMN,QAAQ,CAAC,CAAC;EACzB,CAAC,SAAS;IACR,KAAK,MAAM,CAACG,GAAG,EAAEG,KAAK,CAAC,IAAIL,cAAc,EAAE;MACzC,IAAIK,KAAK,KAAKG,SAAS,EAAE;QACvB,OAAOJ,OAAO,CAACN,GAAG,CAACI,GAAG,CAAC;QACvB;MACF;MAEAE,OAAO,CAACN,GAAG,CAACI,GAAG,CAAC,GAAGG,KAAK;IAC1B;EACF;AACF,CAAC;AAED,MAAMI,6BAA6B,GAAG,MAAAA,CAAA,KAAY;EAChD,MAAMC,gBAAgB,GAAG,MAAMnB,EAAE,CAACoB,OAAO,CAAClB,IAAI,CAACmB,IAAI,CAACpB,EAAE,CAACqB,MAAM,CAAC,CAAC,EAAE,+BAA+B,CAAC,CAAC;EAElG,MAAMC,aAAa,GAAG,MAAMjB,cAAc,CAAC,CAAC,CAAC,EAAE,MAAMV,aAAa,CAACuB,gBAAgB,CAAC,CAAC;EACrF,IAAII,aAAa,CAACC,aAAa,KAAKrB,qBAAqB,EAAE;IACzD,MAAM,IAAIsB,KAAK,CAAC,mCAAmCtB,qBAAqB,cAAcoB,aAAa,CAACC,aAAa,EAAE,CAAC;EACtH;EAEA,MAAME,cAAc,GAAG,MAAMpB,cAAc,CAAC;IAAEqB,IAAI,EAAE;EAAQ,CAAC,EAAE,MAAM/B,aAAa,CAACuB,gBAAgB,CAAC,CAAC;EACrG,IAAIO,cAAc,CAACF,aAAa,KAAKrB,qBAAqB,EAAE;IAC1D,MAAM,IAAIsB,KAAK,CAAC,6CAA6CtB,qBAAqB,cAAcuB,cAAc,CAACF,aAAa,EAAE,CAAC;EACjI;EAEA,MAAMI,uBAAuB,GAAG,MAAMtB,cAAc,CAAC;IAAEuB,OAAO,EAAE;EAAyB,CAAC,EAAE,MAC1FjC,aAAa,CAACuB,gBAAgB,CAChC,CAAC;EACD,IAAIS,uBAAuB,CAACJ,aAAa,KAAKrB,qBAAqB,EAAE;IACnE,MAAM,IAAIsB,KAAK,CACb,uDAAuDtB,qBAAqB,cAAcyB,uBAAuB,CAACJ,aAAa,EACjI,CAAC;EACH;EAEA,MAAMM,cAAc,GAAG,MAAMxB,cAAc,CAAC;IAAEyB,8BAA8B,EAAE3B;EAA8B,CAAC,EAAE,MAC7GR,aAAa,CAACuB,gBAAgB,CAChC,CAAC;EACD,IAAIW,cAAc,CAACN,aAAa,KAAKpB,6BAA6B,EAAE;IAClE,MAAM,IAAIqB,KAAK,CAAC,sCAAsCrB,6BAA6B,cAAc0B,cAAc,CAACN,aAAa,EAAE,CAAC;EAClI;EAEA,OAAO;IACLQ,oBAAoB,EAAET,aAAa,CAACC,aAAa;IACjDS,qBAAqB,EAAEP,cAAc,CAACF,aAAa;IACnDU,8BAA8B,EAAEN,uBAAuB,CAACJ,aAAa;IACrEW,6BAA6B,EAAEL,cAAc,CAACN;EAChD,CAAC;AACH,CAAC;AAED,MAAMY,GAAG,GAAG,MAAAA,CAAA,KAAY;EACtB,MAAMC,OAAqC,GAAG;IAC5CC,SAAS,EAAE;MACTC,EAAE,EAAE,aAAa;MACjBC,IAAI,EAAE,iBAAiB;MACvBC,IAAI,EAAE,iBAAiB;MACvBC,aAAa,EAAE,yCAAyC;MACxDC,aAAa,EAAE,MAAM;MACrBC,MAAM,EAAE;IACV,CAAC;IACDC,aAAa,EAAE,GAAG;IAClBC,MAAM,EAAE,CACN;MACEC,gBAAgB,EAAE,WAAW;MAC7BC,cAAc,EAAE,MAAM;MACtBC,SAAS,EAAE,GAAG;MACdC,eAAe,EAAE,IAAI;MACrBC,KAAK,EAAE;QACLZ,EAAE,EAAE,SAAS;QACbC,IAAI,EAAE,cAAc;QACpBC,IAAI,EAAE,cAAc;QACpBW,OAAO,EAAE,oBAAoB;QAC7BC,SAAS,EAAE,kEAAkE;QAC7ET,MAAM,EAAE,QAAQ;QAChBU,aAAa,EAAE,qBAAqB;QACpCC,IAAI,EAAE,CACJ;UACEhB,EAAE,EAAE,OAAO;UACXC,IAAI,EAAE,MAAM;UACZgB,KAAK,EAAE,MAAM;UACbC,WAAW,EAAE,IAAI;UACjBC,KAAK,EAAE;YACLnB,EAAE,EAAE,SAAS;YACbC,IAAI,EAAE,YAAY;YAClBgB,KAAK,EAAE,YAAY;YACnBC,WAAW,EAAE;UACf;QACF,CAAC;MAEL,CAAC;MACDE,YAAY,EAAE;QACZpB,EAAE,EAAE,WAAW;QACfqB,OAAO,EAAE,OAAO;QAChBC,KAAK,EAAE,SAAS;QAChBT,OAAO,EAAE,iBAAiB;QAC1BR,MAAM,EAAE;MACV,CAAC;MACDkB,iBAAiB,EAAE;QACjBvB,EAAE,EAAE,YAAY;QAChBwB,eAAe,EAAE,cAAc;QAC/BC,sBAAsB,EAAE,gBAAgB;QACxCC,QAAQ,EAAE,YAAY;QACtBC,WAAW,EAAE;MACf;IACF,CAAC,CACF;IACDC,aAAa,EAAE,EAAE;IACjBC,eAAe,EAAE;MACfC,QAAQ,EAAE,uBAAuB;MACjCC,OAAO,EAAE,QAAQ;MACjBC,aAAa,EAAE;IACjB;EACF,CAAC;EACD,MAAMC,UAAoC,GAAG;IAC3C,GAAGnC,OAAO,CAACS,MAAM,CAAC,CAAC,CAAC;IACpBgB,iBAAiB,EAAE;MACjB,GAAGzB,OAAO,CAACS,MAAM,CAAC,CAAC,CAAC,CAACgB,iBAAiB;MACtCW,YAAY,EAAE,kDAAkD;MAChEC,eAAe,EAAE;IACnB;EACF,CAAC;EAED,MAAMC,MAAM,GAAG,MAAM/E,aAAa,CAACiB,OAAO,CAAC+D,GAAG,CAAC,CAAC,CAAC;EACjD,MAAMC,kBAAkB,GAAG,MAAM3D,6BAA6B,CAAC,CAAC;EAEhE,MAAM4D,OAAO,GAAGhF,uBAAuB,CAACuC,OAAO,CAAC;EAChD,MAAM0C,SAAS,GAAGlF,qBAAqB,CAACwC,OAAO,EAAE,CAAC,cAAc,EAAE,eAAe,CAAC,CAAC;EACnF,MAAM2C,MAAM,GAAGD,SAAS,CAACE,aAAa,CAAC,CAAC,CAAC,GAAGlF,sBAAsB,CAACyE,UAAU,CAAC,GAAG,IAAI;EACrF,MAAMU,OAAO,GAAGvF,kBAAkB,CAAC6E,UAAU,CAAC,CAACW,KAAK,CAAC,IAAI,CAAC,CAACC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC;EAEtEC,OAAO,CAACC,GAAG,CACTC,IAAI,CAACC,SAAS,CACZ;IACEC,WAAW,EAAEX,OAAO,CAACW,WAAW;IAChCC,UAAU,EAAEf,MAAM,CAACe,UAAU;IAC7Bb,kBAAkB;IAClBc,mBAAmB,EAAEb,OAAO,CAACa,mBAAmB;IAChDC,cAAc,EAAEd,OAAO,CAACc,cAAc;IACtCC,MAAM,EAAEf,OAAO,CAACe,MAAM;IACtBC,kBAAkB,EAAEf,SAAS,CAACE,aAAa,CAACc,MAAM;IAClDC,aAAa,EAAEjB,SAAS,CAACkB,kBAAkB;IAC3CC,iBAAiB,EAAElB,MAAM,EAAEmB,SAAS,IAAI,IAAI;IAC5CC,iBAAiB,EAAEpB,MAAM,EAAEzB,IAAI,IAAI,EAAE;IACrC8C,mCAAmC,EAAErB,MAAM,EAAEsB,gBAAgB,CAACC,UAAU,CAAC,KAAK,CAAC,IAAI,KAAK;IACxFrB,OAAO;IACPsB,2BAA2B,EAAExB,MAAM,EAAEP,YAAY,CAACgC,QAAQ,CAAC,iCAAiC,CAAC,IAAI;EACnG,CAAC,EACD,IAAI,EACJ,CACF,CACF,CAAC;AACH,CAAC;AAED,KAAKrE,GAAG,CAAC,CAAC","ignoreList":[]}
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
export declare const PRIVATE_JSON_FILE_MODE = 384;
|
|
2
|
+
export declare const PRIVATE_JSON_DIRECTORY_MODE = 448;
|
|
3
|
+
export declare const readJsonFile: (filePath: string) => Promise<unknown | null>;
|
|
4
|
+
export declare const writePrivateJsonFile: (filePath: string, value: unknown) => Promise<void>;
|
|
5
|
+
export declare const deleteFileIfExists: (filePath: string) => Promise<void>;
|
package/dist/storage.js
ADDED
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
import fs from 'node:fs/promises';
|
|
2
|
+
import crypto from 'node:crypto';
|
|
3
|
+
import path from 'node:path';
|
|
4
|
+
export const PRIVATE_JSON_FILE_MODE = 0o600;
|
|
5
|
+
export const PRIVATE_JSON_DIRECTORY_MODE = 0o700;
|
|
6
|
+
export const readJsonFile = async filePath => {
|
|
7
|
+
try {
|
|
8
|
+
const raw = await fs.readFile(filePath, 'utf8');
|
|
9
|
+
const parsed = JSON.parse(raw);
|
|
10
|
+
return parsed;
|
|
11
|
+
} catch {
|
|
12
|
+
return null;
|
|
13
|
+
}
|
|
14
|
+
};
|
|
15
|
+
export const writePrivateJsonFile = async (filePath, value) => {
|
|
16
|
+
const directoryPath = path.dirname(filePath);
|
|
17
|
+
const temporaryFilePath = path.join(directoryPath, `.${path.basename(filePath)}.${process.pid}.${crypto.randomUUID()}.tmp`);
|
|
18
|
+
await fs.mkdir(directoryPath, {
|
|
19
|
+
recursive: true,
|
|
20
|
+
mode: PRIVATE_JSON_DIRECTORY_MODE
|
|
21
|
+
});
|
|
22
|
+
try {
|
|
23
|
+
await fs.writeFile(temporaryFilePath, `${JSON.stringify(value, null, 2)}\n`, {
|
|
24
|
+
encoding: 'utf8',
|
|
25
|
+
mode: PRIVATE_JSON_FILE_MODE,
|
|
26
|
+
flag: 'w'
|
|
27
|
+
});
|
|
28
|
+
await fs.chmod(temporaryFilePath, PRIVATE_JSON_FILE_MODE).catch(() => undefined);
|
|
29
|
+
await fs.rename(temporaryFilePath, filePath);
|
|
30
|
+
await fs.chmod(filePath, PRIVATE_JSON_FILE_MODE).catch(() => undefined);
|
|
31
|
+
} catch (error) {
|
|
32
|
+
await fs.rm(temporaryFilePath, {
|
|
33
|
+
force: true
|
|
34
|
+
}).catch(() => undefined);
|
|
35
|
+
throw error;
|
|
36
|
+
}
|
|
37
|
+
};
|
|
38
|
+
export const deleteFileIfExists = async filePath => {
|
|
39
|
+
await fs.rm(filePath, {
|
|
40
|
+
force: true
|
|
41
|
+
});
|
|
42
|
+
};
|
|
43
|
+
//# sourceMappingURL=storage.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"names":["fs","crypto","path","PRIVATE_JSON_FILE_MODE","PRIVATE_JSON_DIRECTORY_MODE","readJsonFile","filePath","raw","readFile","parsed","JSON","parse","writePrivateJsonFile","value","directoryPath","dirname","temporaryFilePath","join","basename","process","pid","randomUUID","mkdir","recursive","mode","writeFile","stringify","encoding","flag","chmod","catch","undefined","rename","error","rm","force","deleteFileIfExists"],"sources":["../src/storage.ts"],"sourcesContent":["import fs from 'node:fs/promises';\nimport crypto from 'node:crypto';\nimport path from 'node:path';\n\nexport const PRIVATE_JSON_FILE_MODE = 0o600;\nexport const PRIVATE_JSON_DIRECTORY_MODE = 0o700;\n\nexport const readJsonFile = async (filePath: string): Promise<unknown | null> => {\n try {\n const raw = await fs.readFile(filePath, 'utf8');\n const parsed: unknown = JSON.parse(raw);\n return parsed;\n } catch {\n return null;\n }\n};\n\nexport const writePrivateJsonFile = async (filePath: string, value: unknown): Promise<void> => {\n const directoryPath = path.dirname(filePath);\n const temporaryFilePath = path.join(\n directoryPath,\n `.${path.basename(filePath)}.${process.pid}.${crypto.randomUUID()}.tmp`,\n );\n\n await fs.mkdir(directoryPath, { recursive: true, mode: PRIVATE_JSON_DIRECTORY_MODE });\n\n try {\n await fs.writeFile(temporaryFilePath, `${JSON.stringify(value, null, 2)}\\n`, {\n encoding: 'utf8',\n mode: PRIVATE_JSON_FILE_MODE,\n flag: 'w',\n });\n await fs.chmod(temporaryFilePath, PRIVATE_JSON_FILE_MODE).catch(() => undefined);\n await fs.rename(temporaryFilePath, filePath);\n await fs.chmod(filePath, PRIVATE_JSON_FILE_MODE).catch(() => undefined);\n } catch (error) {\n await fs.rm(temporaryFilePath, { force: true }).catch(() => undefined);\n throw error;\n }\n};\n\nexport const deleteFileIfExists = async (filePath: string): Promise<void> => {\n await fs.rm(filePath, { force: true });\n};\n"],"mappings":"AAAA,OAAOA,EAAE,MAAM,kBAAkB;AACjC,OAAOC,MAAM,MAAM,aAAa;AAChC,OAAOC,IAAI,MAAM,WAAW;AAE5B,OAAO,MAAMC,sBAAsB,GAAG,KAAK;AAC3C,OAAO,MAAMC,2BAA2B,GAAG,KAAK;AAEhD,OAAO,MAAMC,YAAY,GAAG,MAAOC,QAAgB,IAA8B;EAC/E,IAAI;IACF,MAAMC,GAAG,GAAG,MAAMP,EAAE,CAACQ,QAAQ,CAACF,QAAQ,EAAE,MAAM,CAAC;IAC/C,MAAMG,MAAe,GAAGC,IAAI,CAACC,KAAK,CAACJ,GAAG,CAAC;IACvC,OAAOE,MAAM;EACf,CAAC,CAAC,MAAM;IACN,OAAO,IAAI;EACb;AACF,CAAC;AAED,OAAO,MAAMG,oBAAoB,GAAG,MAAAA,CAAON,QAAgB,EAAEO,KAAc,KAAoB;EAC7F,MAAMC,aAAa,GAAGZ,IAAI,CAACa,OAAO,CAACT,QAAQ,CAAC;EAC5C,MAAMU,iBAAiB,GAAGd,IAAI,CAACe,IAAI,CACjCH,aAAa,EACb,IAAIZ,IAAI,CAACgB,QAAQ,CAACZ,QAAQ,CAAC,IAAIa,OAAO,CAACC,GAAG,IAAInB,MAAM,CAACoB,UAAU,CAAC,CAAC,MACnE,CAAC;EAED,MAAMrB,EAAE,CAACsB,KAAK,CAACR,aAAa,EAAE;IAAES,SAAS,EAAE,IAAI;IAAEC,IAAI,EAAEpB;EAA4B,CAAC,CAAC;EAErF,IAAI;IACF,MAAMJ,EAAE,CAACyB,SAAS,CAACT,iBAAiB,EAAE,GAAGN,IAAI,CAACgB,SAAS,CAACb,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE;MAC3Ec,QAAQ,EAAE,MAAM;MAChBH,IAAI,EAAErB,sBAAsB;MAC5ByB,IAAI,EAAE;IACR,CAAC,CAAC;IACF,MAAM5B,EAAE,CAAC6B,KAAK,CAACb,iBAAiB,EAAEb,sBAAsB,CAAC,CAAC2B,KAAK,CAAC,MAAMC,SAAS,CAAC;IAChF,MAAM/B,EAAE,CAACgC,MAAM,CAAChB,iBAAiB,EAAEV,QAAQ,CAAC;IAC5C,MAAMN,EAAE,CAAC6B,KAAK,CAACvB,QAAQ,EAAEH,sBAAsB,CAAC,CAAC2B,KAAK,CAAC,MAAMC,SAAS,CAAC;EACzE,CAAC,CAAC,OAAOE,KAAK,EAAE;IACd,MAAMjC,EAAE,CAACkC,EAAE,CAAClB,iBAAiB,EAAE;MAAEmB,KAAK,EAAE;IAAK,CAAC,CAAC,CAACL,KAAK,CAAC,MAAMC,SAAS,CAAC;IACtE,MAAME,KAAK;EACb;AACF,CAAC;AAED,OAAO,MAAMG,kBAAkB,GAAG,MAAO9B,QAAgB,IAAoB;EAC3E,MAAMN,EAAE,CAACkC,EAAE,CAAC5B,QAAQ,EAAE;IAAE6B,KAAK,EAAE;EAAK,CAAC,CAAC;AACxC,CAAC","ignoreList":[]}
|