@dittowords/cli 4.0.0 → 4.1.0-alpha

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.
Files changed (43) hide show
  1. package/README.md +29 -364
  2. package/bin/config.js +5 -3
  3. package/bin/config.js.map +1 -1
  4. package/bin/generate-swift-struct.js +6 -0
  5. package/bin/generate-swift-struct.js.map +1 -0
  6. package/bin/http/fetchComponentFolders.js +3 -3
  7. package/bin/http/fetchComponentFolders.js.map +1 -1
  8. package/bin/http/fetchComponents.js +13 -5
  9. package/bin/http/fetchComponents.js.map +1 -1
  10. package/bin/http/fetchVariants.js +3 -3
  11. package/bin/http/fetchVariants.js.map +1 -1
  12. package/bin/init/project.js +3 -3
  13. package/bin/init/project.js.map +1 -1
  14. package/bin/pull.js +82 -38
  15. package/bin/pull.js.map +1 -1
  16. package/bin/pull.test.js +26 -24
  17. package/bin/pull.test.js.map +1 -1
  18. package/bin/types.js +2 -2
  19. package/bin/types.js.map +1 -1
  20. package/bin/utils/determineModuleType.js +80 -0
  21. package/bin/utils/determineModuleType.js.map +1 -0
  22. package/bin/utils/generateIOSBundles.js +147 -0
  23. package/bin/utils/generateIOSBundles.js.map +1 -0
  24. package/bin/utils/generateJsDriver.js +117 -58
  25. package/bin/utils/generateJsDriver.js.map +1 -1
  26. package/bin/utils/generateJsDriverTypeFile.js +105 -0
  27. package/bin/utils/generateJsDriverTypeFile.js.map +1 -0
  28. package/bin/utils/generateSwiftDriver.js +93 -0
  29. package/bin/utils/generateSwiftDriver.js.map +1 -0
  30. package/lib/config.ts +4 -0
  31. package/lib/http/fetchComponentFolders.ts +1 -1
  32. package/lib/http/fetchComponents.ts +14 -9
  33. package/lib/http/fetchVariants.ts +1 -1
  34. package/lib/init/project.ts +1 -1
  35. package/lib/pull.test.ts +24 -22
  36. package/lib/pull.ts +106 -55
  37. package/lib/types.ts +4 -0
  38. package/lib/utils/determineModuleType.ts +57 -0
  39. package/lib/utils/generateIOSBundles.ts +122 -0
  40. package/lib/utils/generateJsDriver.ts +156 -51
  41. package/lib/utils/generateJsDriverTypeFile.ts +75 -0
  42. package/lib/utils/generateSwiftDriver.ts +48 -0
  43. package/package.json +1 -1
@@ -1 +1 @@
1
- {"version":3,"sources":["../lib/pull.test.ts"],"sourcesContent":["import fs from \"fs\";\nimport path from \"path\";\n\njest.mock(\"./api\", () => ({\n createApiClient: jest.fn(), // this needs to be mocked in each test that requires it\n}));\nimport { createApiClient } from \"./api\";\n\nconst testProjects: Project[] = [\n {\n id: \"1\",\n name: \"Project 1\",\n fileName: \"Project 1\",\n },\n { id: \"2\", name: \"Project 2\", fileName: \"Project 2\" },\n];\n\n// TODO: all tests in this file currently failing because we're re-instantiating the api client\n// everywhere and are unable to mock the return type separately for each instance of usage.\n// We need to refactor to share one api client everywhere instead of always re-creating it.\nconst mockApi = createApiClient() as any as jest.Mocked<\n ReturnType<typeof createApiClient>\n>;\n\njest.mock(\"./consts\", () => ({\n TEXT_DIR: \".testing\",\n API_HOST: \"https://api.dittowords.com\",\n CONFIG_FILE: \".testing/ditto\",\n PROJECT_CONFIG_FILE: \".testing/config.yml\",\n TEXT_FILE: \".testing/text.json\",\n}));\n\nimport consts from \"./consts\";\nimport allPull, { getFormatDataIsValid } from \"./pull\";\nimport { Project } from \"./types\";\n\nconst {\n _testing: { cleanOutputFiles, downloadAndSaveVariant, downloadAndSaveBase },\n} = allPull;\nconst variant = \"english\";\n\nconst cleanOutputDir = () => {\n if (fs.existsSync(consts.TEXT_DIR))\n fs.rmSync(consts.TEXT_DIR, { recursive: true, force: true });\n\n fs.mkdirSync(consts.TEXT_DIR);\n};\n\nafterAll(() => {\n fs.rmSync(consts.TEXT_DIR, { force: true, recursive: true });\n});\n\ndescribe(\"cleanOutputFiles\", () => {\n it(\"removes .js, .json, .xml, .strings, .stringsdict files\", () => {\n cleanOutputDir();\n\n fs.writeFileSync(path.resolve(consts.TEXT_DIR, \"test.json\"), \"test\");\n fs.writeFileSync(path.resolve(consts.TEXT_DIR, \"test.js\"), \"test\");\n fs.writeFileSync(path.resolve(consts.TEXT_DIR, \"test.xml\"), \"test\");\n fs.writeFileSync(path.resolve(consts.TEXT_DIR, \"test.strings\"), \"test\");\n fs.writeFileSync(path.resolve(consts.TEXT_DIR, \"test.stringsdict\"), \"test\");\n // this file shouldn't be deleted\n fs.writeFileSync(path.resolve(consts.TEXT_DIR, \"test.txt\"), \"test\");\n\n expect(fs.readdirSync(consts.TEXT_DIR).length).toEqual(6);\n\n cleanOutputFiles();\n\n expect(fs.readdirSync(consts.TEXT_DIR).length).toEqual(1);\n });\n});\n\ndescribe(\"downloadAndSaveBase\", () => {\n beforeAll(() => {\n if (!fs.existsSync(consts.TEXT_DIR)) {\n fs.mkdirSync(consts.TEXT_DIR);\n }\n });\n\n beforeEach(() => {\n cleanOutputDir();\n });\n\n it(\"writes the flat format to disk\", async () => {\n const mockData = {\n hello: \"world\",\n };\n (createApiClient as any).mockImplementation(() => ({\n get: () => ({ data: mockData }),\n }));\n const output = await downloadAndSaveBase(testProjects, \"flat\", undefined);\n expect(/successfully saved/i.test(output)).toEqual(true);\n const directoryContents = fs.readdirSync(consts.TEXT_DIR);\n expect(directoryContents.length).toEqual(testProjects.length);\n expect(directoryContents.every((f) => f.endsWith(\".json\"))).toBe(true);\n expect(\n JSON.parse(\n fs.readFileSync(\n path.resolve(consts.TEXT_DIR, directoryContents[0]),\n \"utf8\"\n )\n )\n ).toEqual(mockData);\n });\n\n it(\"writes the structured format to disk\", async () => {\n const mockData = {\n hello: { text: \"world\" },\n };\n (createApiClient as any).mockImplementation(() => ({\n get: () => ({ data: mockData }),\n }));\n const output = await downloadAndSaveBase(\n testProjects,\n \"structured\",\n undefined\n );\n expect(/successfully saved/i.test(output)).toEqual(true);\n const directoryContents = fs.readdirSync(consts.TEXT_DIR);\n expect(directoryContents.length).toEqual(testProjects.length);\n expect(directoryContents.every((f) => f.endsWith(\".json\"))).toBe(true);\n expect(\n JSON.parse(\n fs.readFileSync(\n path.resolve(consts.TEXT_DIR, directoryContents[0]),\n \"utf8\"\n )\n )\n ).toEqual(mockData);\n });\n\n it(\"writes the icu format to disk\", async () => {\n const mockData = {\n hello: \"world\",\n };\n (createApiClient as any).mockImplementation(() => ({\n get: () => ({ data: mockData }),\n }));\n const output = await downloadAndSaveBase(testProjects, \"icu\", undefined);\n expect(/successfully saved/i.test(output)).toEqual(true);\n const directoryContents = fs.readdirSync(consts.TEXT_DIR);\n expect(directoryContents.length).toEqual(testProjects.length);\n expect(directoryContents.every((f) => f.endsWith(\".json\"))).toBe(true);\n expect(\n JSON.parse(\n fs.readFileSync(\n path.resolve(consts.TEXT_DIR, directoryContents[0]),\n \"utf8\"\n )\n )\n ).toEqual(mockData);\n });\n\n it(\"writes the android format to disk\", async () => {\n const mockData = `\n <?xml version=\"1.0\" encoding=\"utf-8\"?>\n <resources xmlns:xliff=\"urn:oasis:names:tc:xliff:document:1.2\">\n <string name=\"hello-world\" ditto_api_id=\"hello-world\">Hello World</string>\n </resources>\n `;\n (createApiClient as any).mockImplementation(() => ({\n get: () => ({ data: mockData }),\n }));\n const output = await downloadAndSaveBase(\n testProjects,\n \"android\",\n undefined\n );\n expect(/successfully saved/i.test(output)).toEqual(true);\n const directoryContents = fs.readdirSync(consts.TEXT_DIR);\n expect(directoryContents.length).toEqual(testProjects.length);\n expect(directoryContents.every((f) => f.endsWith(\".xml\"))).toBe(true);\n expect(\n fs\n .readFileSync(\n path.resolve(consts.TEXT_DIR, directoryContents[0]),\n \"utf8\"\n )\n .replace(/\\s/g, \"\")\n ).toEqual(mockData.replace(/\\s/g, \"\"));\n });\n\n it(\"writes the ios-strings format to disk\", async () => {\n const mockData = `\n \"hello\" = \"world\"; \n `;\n (createApiClient as any).mockImplementation(() => ({\n get: () => ({ data: mockData }),\n }));\n const output = await downloadAndSaveBase(\n testProjects,\n \"ios-strings\",\n undefined\n );\n expect(/successfully saved/i.test(output)).toEqual(true);\n const directoryContents = fs.readdirSync(consts.TEXT_DIR);\n expect(directoryContents.length).toEqual(testProjects.length);\n expect(directoryContents.every((f) => f.endsWith(\".strings\"))).toBe(true);\n expect(\n fs\n .readFileSync(\n path.resolve(consts.TEXT_DIR, directoryContents[0]),\n \"utf8\"\n )\n .replace(/\\s/g, \"\")\n ).toEqual(mockData.replace(/\\s/g, \"\"));\n });\n\n it(\"writes the ios-stringsdict format to disk\", async () => {\n const mockData = `\n <?xml version=\"1.0\" encoding=\"utf-8\"?>\n <plist version=\"1.0\">\n <dict>\n <key>hello-world</key>\n <dict>\n <key>NSStringLocalizedFormatKey</key>\n <string>%1$#@count@</string>\n <key>count</key>\n <dict>\n <key>NSStringFormatSpecTypeKey</key>\n <string>NSStringPluralRuleType</string>\n <key>NSStringFormatValueTypeKey</key>\n <string>d</string>\n <key>other</key>\n <string>espanol</string>\n </dict>\n </dict>\n </dict>\n </plist>\n `;\n (createApiClient as any).mockImplementation(() => ({\n get: () => ({ data: mockData }),\n }));\n const output = await downloadAndSaveBase(\n testProjects,\n \"ios-stringsdict\",\n undefined\n );\n expect(/successfully saved/i.test(output)).toEqual(true);\n const directoryContents = fs.readdirSync(consts.TEXT_DIR);\n expect(directoryContents.length).toEqual(testProjects.length);\n expect(directoryContents.every((f) => f.endsWith(\".stringsdict\"))).toBe(\n true\n );\n expect(\n fs\n .readFileSync(\n path.resolve(consts.TEXT_DIR, directoryContents[0]),\n \"utf8\"\n )\n .replace(/\\s/g, \"\")\n ).toEqual(mockData.replace(/\\s/g, \"\"));\n });\n});\n\ndescribe(\"getFormatDataIsValid\", () => {\n it(\"handles flat format appropriately\", () => {\n expect(getFormatDataIsValid.flat(\"{}\")).toBe(false);\n expect(getFormatDataIsValid.flat(`{ \"hello\": \"world\" }`)).toBe(true);\n expect(\n getFormatDataIsValid.flat(`{\n \"__variant-name\": \"English\",\n \"__variant-description\": \"\"\n }`)\n ).toBe(false);\n expect(\n getFormatDataIsValid.flat(`{\n \"__variant-name\": \"English\",\n \"__variant-description\": \"\",\n \"hello\": \"world\"\n }`)\n ).toBe(true);\n });\n it(\"handles structured format appropriately\", () => {\n expect(getFormatDataIsValid.structured(\"{}\")).toBe(false);\n expect(\n getFormatDataIsValid.structured(`{ \"hello\": { \"text\": \"world\" } }`)\n ).toBe(true);\n expect(\n getFormatDataIsValid.structured(`{\n \"__variant-name\": \"English\",\n \"__variant-description\": \"\"\n }`)\n ).toBe(false);\n expect(\n getFormatDataIsValid.structured(`{\n \"__variant-name\": \"English\",\n \"__variant-description\": \"\",\n \"hello\": { \"text\": \"world\" }\n }`)\n ).toBe(true);\n });\n it(\"handles icu format appropriately\", () => {\n expect(getFormatDataIsValid.icu(\"{}\")).toBe(false);\n expect(getFormatDataIsValid.icu(`{ \"hello\": \"world\" }`)).toBe(true);\n expect(\n getFormatDataIsValid.icu(`{\n \"__variant-name\": \"English\",\n \"__variant-description\": \"\"\n }`)\n ).toBe(false);\n expect(\n getFormatDataIsValid.icu(`{\n \"__variant-name\": \"English\",\n \"__variant-description\": \"\",\n \"hello\": \"world\"\n }`)\n ).toBe(true);\n });\n it(\"handles android format appropriately\", () => {\n expect(\n getFormatDataIsValid.android(`\n <?xml version=\"1.0\" encoding=\"utf-8\"?>\n <resources xmlns:xliff=\"urn:oasis:names:tc:xliff:document:1.2\"/>\n `)\n ).toBe(false);\n expect(\n getFormatDataIsValid.android(`\n <?xml version=\"1.0\" encoding=\"utf-8\"?>\n <!--Variant Name: English-->\n <!--Variant Description: -->\n <resources xmlns:xliff=\"urn:oasis:names:tc:xliff:document:1.2\"/>\n `)\n ).toBe(false);\n expect(\n getFormatDataIsValid.android(`\n <?xml version=\"1.0\" encoding=\"utf-8\"?>\n <!--Variant Name: English-->\n <!--Variant Description: -->\n <resources xmlns:xliff=\"urn:oasis:names:tc:xliff:document:1.2\">\n <string name=\"hello-world\" ditto_api_id=\"hello-world\">Hello World</string>\n </resources>\n `)\n ).toBe(true);\n });\n it(\"handles ios-strings format appropriately\", () => {\n expect(getFormatDataIsValid[\"ios-strings\"](\"\")).toBe(false);\n expect(\n getFormatDataIsValid[\"ios-strings\"](`\n /* Variant Name: English */\n /* Variant Description: */\n `)\n ).toBe(false);\n expect(\n getFormatDataIsValid[\"ios-strings\"](`\n /* Variant Name: English */\n /* Variant Description: */\n \"Hello\" = \"World\";\n `)\n ).toBe(true);\n });\n it(\"handles ios-stringsdict format appropriately\", () => {\n expect(\n getFormatDataIsValid[\"ios-stringsdict\"](`\n <?xml version=\"1.0\" encoding=\"utf-8\"?>\n <plist version=\"1.0\">\n <dict/>\n </plist>\n `)\n ).toBe(false);\n expect(\n getFormatDataIsValid[\"ios-stringsdict\"](`\n <?xml version=\"1.0\" encoding=\"utf-8\"?>\n <!--Variant Name: English-->\n <!--Variant Description: -->\n <plist version=\"1.0\">\n <dict/>\n </plist>\n `)\n ).toBe(false);\n expect(\n getFormatDataIsValid[\"ios-stringsdict\"](`\n <?xml version=\"1.0\" encoding=\"utf-8\"?>\n <!--Variant Name: English-->\n <!--Variant Description: -->\n <plist version=\"1.0\">\n <dict>\n <key>Hello World</key>\n <dict>\n <key>NSStringLocalizedFormatKey</key>\n <string>%1$#@count@</string>\n <key>count</key>\n <dict>\n <key>NSStringFormatSpecTypeKey</key>\n <string>NSStringPluralRuleType</string>\n <key>NSStringFormatValueTypeKey</key>\n <string>d</string>\n <key>other</key>\n <string>espanol</string>\n </dict>\n </dict>\n </dict>\n </plist>\n `)\n ).toBe(true);\n });\n});\n"],"names":["allPull","fs","consts","path"],"mappings":"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","debug_id":"427580ef-3c40-54c0-b065-34af4812ad98"}
1
+ {"version":3,"sources":["../lib/pull.test.ts"],"sourcesContent":["import fs from \"fs\";\nimport path from \"path\";\n\njest.mock(\"./api\", () => ({\n createApiClient: jest.fn(), // this needs to be mocked in each test that requires it\n}));\nimport { createApiClient } from \"./api\";\n\nconst testProjects: Project[] = [\n {\n id: \"1\",\n name: \"Project 1\",\n fileName: \"Project 1\",\n },\n { id: \"2\", name: \"Project 2\", fileName: \"Project 2\" },\n];\n\n// TODO: all tests in this file currently failing because we're re-instantiating the api client\n// everywhere and are unable to mock the return type separately for each instance of usage.\n// We need to refactor to share one api client everywhere instead of always re-creating it.\nconst mockApi = createApiClient() as any as jest.Mocked<\n ReturnType<typeof createApiClient>\n>;\n\njest.mock(\"./consts\", () => ({\n TEXT_DIR: \".testing\",\n API_HOST: \"https://api.dittowords.com\",\n CONFIG_FILE: \".testing/ditto\",\n PROJECT_CONFIG_FILE: \".testing/config.yml\",\n TEXT_FILE: \".testing/text.json\",\n}));\n\nimport consts from \"./consts\";\nimport allPull, { getFormatDataIsValid } from \"./pull\";\nimport { Project } from \"./types\";\n\nconst {\n _testing: { cleanOutputFiles, downloadAndSaveVariant, downloadAndSaveBase },\n} = allPull;\nconst variant = \"english\";\n\nconst cleanOutputDir = () => {\n if (fs.existsSync(consts.TEXT_DIR))\n fs.rmSync(consts.TEXT_DIR, { recursive: true, force: true });\n\n fs.mkdirSync(consts.TEXT_DIR);\n};\n\nafterAll(() => {\n fs.rmSync(consts.TEXT_DIR, { force: true, recursive: true });\n});\n\ndescribe(\"cleanOutputFiles\", () => {\n it(\"removes .js, .json, .xml, .strings, .stringsdict files\", () => {\n cleanOutputDir();\n\n fs.writeFileSync(path.resolve(consts.TEXT_DIR, \"test.json\"), \"test\");\n fs.writeFileSync(path.resolve(consts.TEXT_DIR, \"test.js\"), \"test\");\n fs.writeFileSync(path.resolve(consts.TEXT_DIR, \"test.xml\"), \"test\");\n fs.writeFileSync(path.resolve(consts.TEXT_DIR, \"test.strings\"), \"test\");\n fs.writeFileSync(path.resolve(consts.TEXT_DIR, \"test.stringsdict\"), \"test\");\n // this file shouldn't be deleted\n fs.writeFileSync(path.resolve(consts.TEXT_DIR, \"test.txt\"), \"test\");\n\n expect(fs.readdirSync(consts.TEXT_DIR).length).toEqual(6);\n\n cleanOutputFiles();\n\n expect(fs.readdirSync(consts.TEXT_DIR).length).toEqual(1);\n });\n});\n\ndescribe(\"downloadAndSaveBase\", () => {\n beforeAll(() => {\n if (!fs.existsSync(consts.TEXT_DIR)) {\n fs.mkdirSync(consts.TEXT_DIR);\n }\n });\n\n beforeEach(() => {\n cleanOutputDir();\n });\n\n it(\"writes the flat format to disk\", async () => {\n const mockData = {\n hello: \"world\",\n };\n (createApiClient as any).mockImplementation(() => ({\n get: () => ({ data: mockData }),\n }));\n const output = await downloadAndSaveBase({\n projects: testProjects,\n format: \"flat\",\n } as any);\n expect(/successfully saved/i.test(output)).toEqual(true);\n const directoryContents = fs.readdirSync(consts.TEXT_DIR);\n expect(directoryContents.length).toEqual(testProjects.length);\n expect(directoryContents.every((f) => f.endsWith(\".json\"))).toBe(true);\n expect(\n JSON.parse(\n fs.readFileSync(\n path.resolve(consts.TEXT_DIR, directoryContents[0]),\n \"utf8\"\n )\n )\n ).toEqual(mockData);\n });\n\n it(\"writes the structured format to disk\", async () => {\n const mockData = {\n hello: { text: \"world\" },\n };\n (createApiClient as any).mockImplementation(() => ({\n get: () => ({ data: mockData }),\n }));\n const output = await downloadAndSaveBase({\n projects: testProjects,\n format: \"structured\",\n } as any);\n expect(/successfully saved/i.test(output)).toEqual(true);\n const directoryContents = fs.readdirSync(consts.TEXT_DIR);\n expect(directoryContents.length).toEqual(testProjects.length);\n expect(directoryContents.every((f) => f.endsWith(\".json\"))).toBe(true);\n expect(\n JSON.parse(\n fs.readFileSync(\n path.resolve(consts.TEXT_DIR, directoryContents[0]),\n \"utf8\"\n )\n )\n ).toEqual(mockData);\n });\n\n it(\"writes the icu format to disk\", async () => {\n const mockData = {\n hello: \"world\",\n };\n (createApiClient as any).mockImplementation(() => ({\n get: () => ({ data: mockData }),\n }));\n const output = await downloadAndSaveBase({\n projects: testProjects,\n format: \"icu\",\n } as any);\n expect(/successfully saved/i.test(output)).toEqual(true);\n const directoryContents = fs.readdirSync(consts.TEXT_DIR);\n expect(directoryContents.length).toEqual(testProjects.length);\n expect(directoryContents.every((f) => f.endsWith(\".json\"))).toBe(true);\n expect(\n JSON.parse(\n fs.readFileSync(\n path.resolve(consts.TEXT_DIR, directoryContents[0]),\n \"utf8\"\n )\n )\n ).toEqual(mockData);\n });\n\n it(\"writes the android format to disk\", async () => {\n const mockData = `\n <?xml version=\"1.0\" encoding=\"utf-8\"?>\n <resources xmlns:xliff=\"urn:oasis:names:tc:xliff:document:1.2\">\n <string name=\"hello-world\" ditto_api_id=\"hello-world\">Hello World</string>\n </resources>\n `;\n (createApiClient as any).mockImplementation(() => ({\n get: () => ({ data: mockData }),\n }));\n const output = await downloadAndSaveBase({\n projects: testProjects,\n format: \"android\",\n } as any);\n expect(/successfully saved/i.test(output)).toEqual(true);\n const directoryContents = fs.readdirSync(consts.TEXT_DIR);\n expect(directoryContents.length).toEqual(testProjects.length);\n expect(directoryContents.every((f) => f.endsWith(\".xml\"))).toBe(true);\n expect(\n fs\n .readFileSync(\n path.resolve(consts.TEXT_DIR, directoryContents[0]),\n \"utf8\"\n )\n .replace(/\\s/g, \"\")\n ).toEqual(mockData.replace(/\\s/g, \"\"));\n });\n\n it(\"writes the ios-strings format to disk\", async () => {\n const mockData = `\n \"hello\" = \"world\"; \n `;\n (createApiClient as any).mockImplementation(() => ({\n get: () => ({ data: mockData }),\n }));\n const output = await downloadAndSaveBase({\n projects: testProjects,\n format: \"ios-strings\",\n } as any);\n expect(/successfully saved/i.test(output)).toEqual(true);\n const directoryContents = fs.readdirSync(consts.TEXT_DIR);\n expect(directoryContents.length).toEqual(testProjects.length);\n expect(directoryContents.every((f) => f.endsWith(\".strings\"))).toBe(true);\n expect(\n fs\n .readFileSync(\n path.resolve(consts.TEXT_DIR, directoryContents[0]),\n \"utf8\"\n )\n .replace(/\\s/g, \"\")\n ).toEqual(mockData.replace(/\\s/g, \"\"));\n });\n\n it(\"writes the ios-stringsdict format to disk\", async () => {\n const mockData = `\n <?xml version=\"1.0\" encoding=\"utf-8\"?>\n <plist version=\"1.0\">\n <dict>\n <key>hello-world</key>\n <dict>\n <key>NSStringLocalizedFormatKey</key>\n <string>%1$#@count@</string>\n <key>count</key>\n <dict>\n <key>NSStringFormatSpecTypeKey</key>\n <string>NSStringPluralRuleType</string>\n <key>NSStringFormatValueTypeKey</key>\n <string>d</string>\n <key>other</key>\n <string>espanol</string>\n </dict>\n </dict>\n </dict>\n </plist>\n `;\n (createApiClient as any).mockImplementation(() => ({\n get: () => ({ data: mockData }),\n }));\n const output = await downloadAndSaveBase({\n projects: testProjects,\n format: \"ios-stringsdict\",\n } as any);\n expect(/successfully saved/i.test(output)).toEqual(true);\n const directoryContents = fs.readdirSync(consts.TEXT_DIR);\n expect(directoryContents.length).toEqual(testProjects.length);\n expect(directoryContents.every((f) => f.endsWith(\".stringsdict\"))).toBe(\n true\n );\n expect(\n fs\n .readFileSync(\n path.resolve(consts.TEXT_DIR, directoryContents[0]),\n \"utf8\"\n )\n .replace(/\\s/g, \"\")\n ).toEqual(mockData.replace(/\\s/g, \"\"));\n });\n});\n\ndescribe(\"getFormatDataIsValid\", () => {\n it(\"handles flat format appropriately\", () => {\n expect(getFormatDataIsValid.flat(\"{}\")).toBe(false);\n expect(getFormatDataIsValid.flat(`{ \"hello\": \"world\" }`)).toBe(true);\n expect(\n getFormatDataIsValid.flat(`{\n \"__variant-name\": \"English\",\n \"__variant-description\": \"\"\n }`)\n ).toBe(false);\n expect(\n getFormatDataIsValid.flat(`{\n \"__variant-name\": \"English\",\n \"__variant-description\": \"\",\n \"hello\": \"world\"\n }`)\n ).toBe(true);\n });\n it(\"handles structured format appropriately\", () => {\n expect(getFormatDataIsValid.structured(\"{}\")).toBe(false);\n expect(\n getFormatDataIsValid.structured(`{ \"hello\": { \"text\": \"world\" } }`)\n ).toBe(true);\n expect(\n getFormatDataIsValid.structured(`{\n \"__variant-name\": \"English\",\n \"__variant-description\": \"\"\n }`)\n ).toBe(false);\n expect(\n getFormatDataIsValid.structured(`{\n \"__variant-name\": \"English\",\n \"__variant-description\": \"\",\n \"hello\": { \"text\": \"world\" }\n }`)\n ).toBe(true);\n });\n it(\"handles icu format appropriately\", () => {\n expect(getFormatDataIsValid.icu(\"{}\")).toBe(false);\n expect(getFormatDataIsValid.icu(`{ \"hello\": \"world\" }`)).toBe(true);\n expect(\n getFormatDataIsValid.icu(`{\n \"__variant-name\": \"English\",\n \"__variant-description\": \"\"\n }`)\n ).toBe(false);\n expect(\n getFormatDataIsValid.icu(`{\n \"__variant-name\": \"English\",\n \"__variant-description\": \"\",\n \"hello\": \"world\"\n }`)\n ).toBe(true);\n });\n it(\"handles android format appropriately\", () => {\n expect(\n getFormatDataIsValid.android(`\n <?xml version=\"1.0\" encoding=\"utf-8\"?>\n <resources xmlns:xliff=\"urn:oasis:names:tc:xliff:document:1.2\"/>\n `)\n ).toBe(false);\n expect(\n getFormatDataIsValid.android(`\n <?xml version=\"1.0\" encoding=\"utf-8\"?>\n <!--Variant Name: English-->\n <!--Variant Description: -->\n <resources xmlns:xliff=\"urn:oasis:names:tc:xliff:document:1.2\"/>\n `)\n ).toBe(false);\n expect(\n getFormatDataIsValid.android(`\n <?xml version=\"1.0\" encoding=\"utf-8\"?>\n <!--Variant Name: English-->\n <!--Variant Description: -->\n <resources xmlns:xliff=\"urn:oasis:names:tc:xliff:document:1.2\">\n <string name=\"hello-world\" ditto_api_id=\"hello-world\">Hello World</string>\n </resources>\n `)\n ).toBe(true);\n });\n it(\"handles ios-strings format appropriately\", () => {\n expect(getFormatDataIsValid[\"ios-strings\"](\"\")).toBe(false);\n expect(\n getFormatDataIsValid[\"ios-strings\"](`\n /* Variant Name: English */\n /* Variant Description: */\n `)\n ).toBe(false);\n expect(\n getFormatDataIsValid[\"ios-strings\"](`\n /* Variant Name: English */\n /* Variant Description: */\n \"Hello\" = \"World\";\n `)\n ).toBe(true);\n });\n it(\"handles ios-stringsdict format appropriately\", () => {\n expect(\n getFormatDataIsValid[\"ios-stringsdict\"](`\n <?xml version=\"1.0\" encoding=\"utf-8\"?>\n <plist version=\"1.0\">\n <dict/>\n </plist>\n `)\n ).toBe(false);\n expect(\n getFormatDataIsValid[\"ios-stringsdict\"](`\n <?xml version=\"1.0\" encoding=\"utf-8\"?>\n <!--Variant Name: English-->\n <!--Variant Description: -->\n <plist version=\"1.0\">\n <dict/>\n </plist>\n `)\n ).toBe(false);\n expect(\n getFormatDataIsValid[\"ios-stringsdict\"](`\n <?xml version=\"1.0\" encoding=\"utf-8\"?>\n <!--Variant Name: English-->\n <!--Variant Description: -->\n <plist version=\"1.0\">\n <dict>\n <key>Hello World</key>\n <dict>\n <key>NSStringLocalizedFormatKey</key>\n <string>%1$#@count@</string>\n <key>count</key>\n <dict>\n <key>NSStringFormatSpecTypeKey</key>\n <string>NSStringPluralRuleType</string>\n <key>NSStringFormatValueTypeKey</key>\n <string>d</string>\n <key>other</key>\n <string>espanol</string>\n </dict>\n </dict>\n </dict>\n </plist>\n `)\n ).toBe(true);\n });\n});\n"],"names":["allPull","fs","consts","path"],"mappings":"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","debug_id":"587c3043-a9e4-58d4-9ce1-1464ba0c94e3"}
package/bin/types.js CHANGED
@@ -1,5 +1,5 @@
1
1
  "use strict";
2
- !function(){try{var e="undefined"!=typeof window?window:"undefined"!=typeof global?global:"undefined"!=typeof self?self:{},n=(new Error).stack;n&&(e._sentryDebugIds=e._sentryDebugIds||{},e._sentryDebugIds[n]="3a899a8b-8170-53ae-808a-dea1164e29fe")}catch(e){}}();
2
+ !function(){try{var e="undefined"!=typeof window?window:"undefined"!=typeof global?global:"undefined"!=typeof self?self:{},n=(new Error).stack;n&&(e._sentryDebugIds=e._sentryDebugIds||{},e._sentryDebugIds[n]="3fd35928-772d-586f-a6e9-20088cfb3e41")}catch(e){}}();
3
3
 
4
4
  var __defProp = Object.defineProperty;
5
5
  var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
@@ -18,4 +18,4 @@ var types_exports = {};
18
18
  module.exports = __toCommonJS(types_exports);
19
19
  //# sourceMappingURL=types.js.map
20
20
 
21
- //# debugId=3a899a8b-8170-53ae-808a-dea1164e29fe
21
+ //# debugId=3fd35928-772d-586f-a6e9-20088cfb3e41
package/bin/types.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../lib/types.ts"],"sourcesContent":["export interface Project {\n name: string;\n id: string;\n url?: string;\n fileName?: string;\n status?: string;\n exclude_components?: boolean;\n}\n\nexport type ComponentSource = ComponentFolder & {\n type: \"components\";\n fileName: string;\n variant: string;\n};\n\nexport type Source = (Project & { type?: undefined }) | ComponentSource;\n\nexport interface ComponentFolder {\n id: string;\n name: string;\n status?: string;\n}\n\nexport type SupportedFormat =\n | \"flat\"\n | \"structured\"\n | \"android\"\n | \"ios-strings\"\n | \"ios-stringsdict\"\n | \"icu\";\n\ntype ComponentsSourceBool = boolean;\ntype ComponentsSourceConfig = {\n root?: boolean | { status: string };\n folders?: ComponentFolder[];\n};\ntype ComponentsSource = ComponentsSourceBool | ComponentsSourceConfig;\n\nexport interface ConfigYAML {\n sources?: {\n components?: ComponentsSource;\n projects?: Project[];\n };\n format?: SupportedFormat;\n status?: string;\n variants?: boolean;\n richText?: boolean;\n\n // these are legacy fields - if they exist, we should output\n // a deprecation error, and suggest that they nest them under\n // a top-level `sources` property\n components?: boolean;\n projects?: Project[];\n}\n\nexport interface SourceInformation {\n hasSourceData: boolean;\n hasTopLevelProjectsField: boolean;\n hasTopLevelComponentsField: boolean;\n hasComponentLibraryInProjects: boolean;\n validProjects: Project[];\n shouldFetchComponentLibrary: boolean;\n variants: boolean;\n format: string | string[] | undefined;\n status: string | undefined;\n richText: boolean | undefined;\n componentRoot: boolean | { status: string } | undefined;\n componentFolders: ComponentFolder[] | undefined;\n}\n\nexport type Token = string | undefined;\n"],"names":[],"mappings":";;;;;;;;;;;;;;;;AAAA;AAAA","debug_id":"3a899a8b-8170-53ae-808a-dea1164e29fe"}
1
+ {"version":3,"sources":["../lib/types.ts"],"sourcesContent":["export interface Project {\n name: string;\n id: string;\n url?: string;\n fileName?: string;\n status?: string;\n exclude_components?: boolean;\n}\n\nexport type ComponentSource = ComponentFolder & {\n type: \"components\";\n fileName: string;\n variant: string;\n};\n\nexport type Source = (Project & { type?: undefined }) | ComponentSource;\n\nexport interface ComponentFolder {\n id: string;\n name: string;\n status?: string;\n}\n\nexport type SupportedFormat =\n | \"flat\"\n | \"structured\"\n | \"android\"\n | \"ios-strings\"\n | \"ios-stringsdict\"\n | \"icu\";\n\ntype ComponentsSourceBool = boolean;\ntype ComponentsSourceConfig = {\n root?: boolean | { status: string };\n folders?: ComponentFolder[];\n};\ntype ComponentsSource = ComponentsSourceBool | ComponentsSourceConfig;\n\nexport interface ConfigYAML {\n sources?: {\n components?: ComponentsSource;\n projects?: Project[];\n };\n format?: SupportedFormat;\n status?: string;\n variants?: boolean;\n richText?: boolean;\n\n // TODO: might want to rename this at some point\n iosLocales?: Record<string, string>[];\n\n // these are legacy fields - if they exist, we should output\n // a deprecation error, and suggest that they nest them under\n // a top-level `sources` property\n components?: boolean;\n projects?: Project[];\n}\n\nexport interface SourceInformation {\n hasSourceData: boolean;\n hasTopLevelProjectsField: boolean;\n hasTopLevelComponentsField: boolean;\n hasComponentLibraryInProjects: boolean;\n validProjects: Project[];\n shouldFetchComponentLibrary: boolean;\n variants: boolean;\n format: string | string[] | undefined;\n status: string | undefined;\n richText: boolean | undefined;\n componentRoot: boolean | { status: string } | undefined;\n componentFolders: ComponentFolder[] | undefined;\n localeByVariantApiId: Record<string, string> | undefined;\n}\n\nexport type Token = string | undefined;\n"],"names":[],"mappings":";;;;;;;;;;;;;;;;AAAA;AAAA","debug_id":"3fd35928-772d-586f-a6e9-20088cfb3e41"}
@@ -0,0 +1,80 @@
1
+ "use strict";
2
+ !function(){try{var e="undefined"!=typeof window?window:"undefined"!=typeof global?global:"undefined"!=typeof self?self:{},n=(new Error).stack;n&&(e._sentryDebugIds=e._sentryDebugIds||{},e._sentryDebugIds[n]="93454caf-75d4-52db-a313-fbad56075bbe")}catch(e){}}();
3
+
4
+ var __create = Object.create;
5
+ var __defProp = Object.defineProperty;
6
+ var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
7
+ var __getOwnPropNames = Object.getOwnPropertyNames;
8
+ var __getProtoOf = Object.getPrototypeOf;
9
+ var __hasOwnProp = Object.prototype.hasOwnProperty;
10
+ var __export = (target, all) => {
11
+ for (var name in all)
12
+ __defProp(target, name, { get: all[name], enumerable: true });
13
+ };
14
+ var __copyProps = (to, from, except, desc) => {
15
+ if (from && typeof from === "object" || typeof from === "function") {
16
+ for (let key of __getOwnPropNames(from))
17
+ if (!__hasOwnProp.call(to, key) && key !== except)
18
+ __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
19
+ }
20
+ return to;
21
+ };
22
+ var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps(
23
+ // If the importer is in node compatibility mode or this is not an ESM
24
+ // file that has been converted to a CommonJS file using a Babel-
25
+ // compatible transform (i.e. "__esModule" has not been set), then set
26
+ // "default" to the CommonJS "module.exports" for node compatibility.
27
+ isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target,
28
+ mod
29
+ ));
30
+ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
31
+ var determineModuleType_exports = {};
32
+ __export(determineModuleType_exports, {
33
+ determineModuleType: () => determineModuleType
34
+ });
35
+ module.exports = __toCommonJS(determineModuleType_exports);
36
+ var fs = __toESM(require("fs"));
37
+ var path = __toESM(require("path"));
38
+ function determineModuleType() {
39
+ const value = getRawTypeFromPackageJson();
40
+ return getTypeOrDefault(value);
41
+ }
42
+ function getRawTypeFromPackageJson() {
43
+ if (process.env.DITTO_MODULE_TYPE) {
44
+ return process.env.DITTO_MODULE_TYPE;
45
+ }
46
+ let currentDir = process.cwd();
47
+ while (currentDir) {
48
+ const packageJsonPath = path.join(currentDir, "package.json");
49
+ if (fs.existsSync(packageJsonPath)) {
50
+ const packageJsonContents = fs.readFileSync(packageJsonPath, "utf8");
51
+ try {
52
+ const packageData = JSON.parse(packageJsonContents);
53
+ if (packageData == null ? void 0 : packageData.type) {
54
+ return packageData.type;
55
+ }
56
+ } catch (e) {
57
+ }
58
+ return null;
59
+ }
60
+ if (currentDir === "/") {
61
+ return null;
62
+ }
63
+ currentDir = path.dirname(currentDir);
64
+ }
65
+ return null;
66
+ }
67
+ function getTypeOrDefault(value) {
68
+ const valueLower = (value == null ? void 0 : value.toLowerCase()) || "";
69
+ if (valueLower === "commonjs" || valueLower === "module") {
70
+ return valueLower;
71
+ }
72
+ return "commonjs";
73
+ }
74
+ // Annotate the CommonJS export names for ESM import in node:
75
+ 0 && (module.exports = {
76
+ determineModuleType
77
+ });
78
+ //# sourceMappingURL=determineModuleType.js.map
79
+
80
+ //# debugId=93454caf-75d4-52db-a313-fbad56075bbe
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../lib/utils/determineModuleType.ts"],"sourcesContent":["import * as fs from \"fs\";\nimport * as path from \"path\";\n\nexport type ModuleType = \"commonjs\" | \"module\";\n\n/**\n * Looks for a `package.json` file starting in the current working directory and traversing upwards\n * until it finds one or reaches root.\n * @returns \"commonjs\" or \"module\", defaulting to \"module\" if no `package.json` is found or if the found\n * file does not include a `type` property.\n */\nexport function determineModuleType() {\n const value = getRawTypeFromPackageJson();\n return getTypeOrDefault(value);\n}\n\nfunction getRawTypeFromPackageJson() {\n if (process.env.DITTO_MODULE_TYPE) {\n return process.env.DITTO_MODULE_TYPE;\n }\n\n let currentDir: string | null = process.cwd(); // Get the current working directory\n\n while (currentDir) {\n const packageJsonPath = path.join(currentDir, \"package.json\");\n if (fs.existsSync(packageJsonPath)) {\n const packageJsonContents = fs.readFileSync(packageJsonPath, \"utf8\");\n try {\n const packageData: { type?: string } = JSON.parse(packageJsonContents);\n if (packageData?.type) {\n return packageData.type;\n }\n } catch {}\n\n return null;\n }\n\n if (currentDir === \"/\") {\n return null;\n }\n\n // Move up a directory and continue the search\n currentDir = path.dirname(currentDir);\n }\n\n // No package.json\n return null;\n}\n\nfunction getTypeOrDefault(value: string | null): ModuleType {\n const valueLower = value?.toLowerCase() || \"\";\n if (valueLower === \"commonjs\" || valueLower === \"module\") {\n return valueLower;\n }\n\n return \"commonjs\";\n}\n"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,SAAoB;AACpB,WAAsB;AAUf,SAAS,sBAAsB;AACpC,QAAM,QAAQ,0BAA0B;AACxC,SAAO,iBAAiB,KAAK;AAC/B;AAEA,SAAS,4BAA4B;AACnC,MAAI,QAAQ,IAAI,mBAAmB;AACjC,WAAO,QAAQ,IAAI;AAAA,EACrB;AAEA,MAAI,aAA4B,QAAQ,IAAI;AAE5C,SAAO,YAAY;AACjB,UAAM,kBAAkB,KAAK,KAAK,YAAY,cAAc;AAC5D,QAAI,GAAG,WAAW,eAAe,GAAG;AAClC,YAAM,sBAAsB,GAAG,aAAa,iBAAiB,MAAM;AACnE,UAAI;AACF,cAAM,cAAiC,KAAK,MAAM,mBAAmB;AACrE,YAAI,2CAAa,MAAM;AACrB,iBAAO,YAAY;AAAA,QACrB;AAAA,MACF,SAAQ;AAAA,MAAC;AAET,aAAO;AAAA,IACT;AAEA,QAAI,eAAe,KAAK;AACtB,aAAO;AAAA,IACT;AAGA,iBAAa,KAAK,QAAQ,UAAU;AAAA,EACtC;AAGA,SAAO;AACT;AAEA,SAAS,iBAAiB,OAAkC;AAC1D,QAAM,cAAa,+BAAO,kBAAiB;AAC3C,MAAI,eAAe,cAAc,eAAe,UAAU;AACxD,WAAO;AAAA,EACT;AAEA,SAAO;AACT","debug_id":"93454caf-75d4-52db-a313-fbad56075bbe"}
@@ -0,0 +1,147 @@
1
+ "use strict";
2
+ !function(){try{var e="undefined"!=typeof window?window:"undefined"!=typeof global?global:"undefined"!=typeof self?self:{},n=(new Error).stack;n&&(e._sentryDebugIds=e._sentryDebugIds||{},e._sentryDebugIds[n]="b23b75ff-e7f4-506d-8f68-909661187171")}catch(e){}}();
3
+
4
+ var __create = Object.create;
5
+ var __defProp = Object.defineProperty;
6
+ var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
7
+ var __getOwnPropNames = Object.getOwnPropertyNames;
8
+ var __getProtoOf = Object.getPrototypeOf;
9
+ var __hasOwnProp = Object.prototype.hasOwnProperty;
10
+ var __export = (target, all) => {
11
+ for (var name in all)
12
+ __defProp(target, name, { get: all[name], enumerable: true });
13
+ };
14
+ var __copyProps = (to, from, except, desc) => {
15
+ if (from && typeof from === "object" || typeof from === "function") {
16
+ for (let key of __getOwnPropNames(from))
17
+ if (!__hasOwnProp.call(to, key) && key !== except)
18
+ __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
19
+ }
20
+ return to;
21
+ };
22
+ var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps(
23
+ // If the importer is in node compatibility mode or this is not an ESM
24
+ // file that has been converted to a CommonJS file using a Babel-
25
+ // compatible transform (i.e. "__esModule" has not been set), then set
26
+ // "default" to the CommonJS "module.exports" for node compatibility.
27
+ isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target,
28
+ mod
29
+ ));
30
+ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
31
+ var __async = (__this, __arguments, generator) => {
32
+ return new Promise((resolve, reject) => {
33
+ var fulfilled = (value) => {
34
+ try {
35
+ step(generator.next(value));
36
+ } catch (e) {
37
+ reject(e);
38
+ }
39
+ };
40
+ var rejected = (value) => {
41
+ try {
42
+ step(generator.throw(value));
43
+ } catch (e) {
44
+ reject(e);
45
+ }
46
+ };
47
+ var step = (x) => x.done ? resolve(x.value) : Promise.resolve(x.value).then(fulfilled, rejected);
48
+ step((generator = generator.apply(__this, __arguments)).next());
49
+ });
50
+ };
51
+ var generateIOSBundles_exports = {};
52
+ __export(generateIOSBundles_exports, {
53
+ generateIOSBundles: () => generateIOSBundles
54
+ });
55
+ module.exports = __toCommonJS(generateIOSBundles_exports);
56
+ var import_path = __toESM(require("path"));
57
+ var import_fs = __toESM(require("fs"));
58
+ var import_consts = __toESM(require("../consts"));
59
+ var import_output = __toESM(require("../output"));
60
+ const IOS_FILE_EXTENSION_PATTERN = /\.(strings|stringsdict)$/;
61
+ function generateIOSBundles(localeByVariantApiId) {
62
+ return __async(this, null, function* () {
63
+ const files = import_fs.default.readdirSync(import_consts.default.TEXT_DIR);
64
+ const bundlesGenerated = {};
65
+ for (const fileName of files) {
66
+ if (!IOS_FILE_EXTENSION_PATTERN.test(fileName)) {
67
+ continue;
68
+ }
69
+ const [name, fileExtension] = fileName.split(".");
70
+ if (!name.length) {
71
+ continue;
72
+ }
73
+ const parts = name.split("__");
74
+ const source = parts[0];
75
+ const variant = parts[parts.length - 1];
76
+ if (!(source && variant)) {
77
+ continue;
78
+ }
79
+ const bundleName = localeByVariantApiId && localeByVariantApiId[variant] ? localeByVariantApiId[variant] : variant;
80
+ const bundleFileName = `${bundleName}.lproj`;
81
+ const bundleFolder = import_path.default.join(import_consts.default.TEXT_DIR, bundleFileName);
82
+ if (!import_fs.default.existsSync(bundleFolder)) {
83
+ import_fs.default.mkdirSync(bundleFolder);
84
+ }
85
+ const filePathCurrent = import_path.default.join(import_consts.default.TEXT_DIR, fileName);
86
+ const filePathNew = import_path.default.join(bundleFolder, `${source}.${fileExtension}`);
87
+ handleBundleGeneration(source, fileExtension, filePathCurrent, filePathNew);
88
+ bundlesGenerated[bundleFileName] = {
89
+ mappedVariant: variant === bundleName ? void 0 : variant
90
+ };
91
+ }
92
+ return Object.keys(bundlesGenerated).map((bundleName) => {
93
+ let msg = `Successfully generated iOS bundle ${import_output.default.info(
94
+ bundleName
95
+ )}`;
96
+ const mappedVariant = bundlesGenerated[bundleName].mappedVariant;
97
+ if (mappedVariant) {
98
+ msg += ` ${import_output.default.subtle(`(mapped to variant '${mappedVariant}')`)}`;
99
+ }
100
+ return msg;
101
+ }).join("\n") + "\n";
102
+ });
103
+ }
104
+ function handleBundleGeneration(sourceId, extension, sourcePath, newFilePath) {
105
+ if (!import_fs.default.existsSync(newFilePath)) {
106
+ return import_fs.default.renameSync(sourcePath, newFilePath);
107
+ }
108
+ if (sourceId !== "components") {
109
+ throw new Error("Bundle path for " + sourceId + " already exists");
110
+ }
111
+ if (extension === "strings") {
112
+ return appendStringsFile(sourcePath, newFilePath);
113
+ }
114
+ if (extension === "stringsdict") {
115
+ return appendStringsDictFile(sourcePath, newFilePath);
116
+ }
117
+ throw new Error("Unsupported extension " + extension);
118
+ }
119
+ function appendStringsFile(sourcePath, destPath) {
120
+ const sourceContents = import_fs.default.readFileSync(sourcePath, "utf-8");
121
+ const newFileContents = import_fs.default.readFileSync(destPath, "utf-8");
122
+ const newContents = newFileContents + "\n" + sourceContents;
123
+ import_fs.default.writeFileSync(destPath, newContents);
124
+ import_fs.default.unlinkSync(sourcePath);
125
+ }
126
+ function appendStringsDictFile(sourcePath, destPath) {
127
+ const sourceContentsFull = import_fs.default.readFileSync(sourcePath, "utf-8");
128
+ const sourceContentsContent = sourceContentsFull.split("\n").slice(3, -4);
129
+ const newFileContentsFull = import_fs.default.readFileSync(destPath, "utf-8");
130
+ const newFileContentsContent = newFileContentsFull.split("\n").slice(3, -4);
131
+ const newContents = `<?xml version="1.0" encoding="utf-8"?>
132
+ <plist version="1.0">
133
+ <dict>
134
+ ${[newFileContentsContent, sourceContentsContent].join("\n")}
135
+ </dict>
136
+ </plist>
137
+ `;
138
+ import_fs.default.writeFileSync(destPath, newContents);
139
+ import_fs.default.unlinkSync(sourcePath);
140
+ }
141
+ // Annotate the CommonJS export names for ESM import in node:
142
+ 0 && (module.exports = {
143
+ generateIOSBundles
144
+ });
145
+ //# sourceMappingURL=generateIOSBundles.js.map
146
+
147
+ //# debugId=b23b75ff-e7f4-506d-8f68-909661187171
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../lib/utils/generateIOSBundles.ts"],"sourcesContent":["import path from \"path\";\nimport fs from \"fs\";\nimport consts from \"../consts\";\nimport output from \"../output\";\n\nconst IOS_FILE_EXTENSION_PATTERN = /\\.(strings|stringsdict)$/;\n\nexport async function generateIOSBundles(\n localeByVariantApiId: Record<string, string> | undefined\n) {\n const files = fs.readdirSync(consts.TEXT_DIR);\n\n const bundlesGenerated: {\n [bundleName: string]: {\n mappedVariant?: string;\n };\n } = {};\n\n for (const fileName of files) {\n if (!IOS_FILE_EXTENSION_PATTERN.test(fileName)) {\n continue;\n }\n\n const [name, fileExtension] = fileName.split(\".\");\n if (!name.length) {\n continue;\n }\n\n const parts = name.split(\"__\");\n const source = parts[0];\n const variant = parts[parts.length - 1];\n if (!(source && variant)) {\n continue;\n }\n\n const bundleName =\n localeByVariantApiId && localeByVariantApiId[variant]\n ? localeByVariantApiId[variant]\n : variant;\n const bundleFileName = `${bundleName}.lproj`;\n const bundleFolder = path.join(consts.TEXT_DIR, bundleFileName);\n if (!fs.existsSync(bundleFolder)) {\n fs.mkdirSync(bundleFolder);\n }\n\n const filePathCurrent = path.join(consts.TEXT_DIR, fileName);\n const filePathNew = path.join(bundleFolder, `${source}.${fileExtension}`);\n\n handleBundleGeneration(source, fileExtension, filePathCurrent, filePathNew);\n\n bundlesGenerated[bundleFileName] = {\n mappedVariant: variant === bundleName ? undefined : variant,\n };\n }\n\n return (\n Object.keys(bundlesGenerated)\n .map((bundleName) => {\n let msg = `Successfully generated iOS bundle ${output.info(\n bundleName\n )}`;\n const mappedVariant = bundlesGenerated[bundleName].mappedVariant;\n if (mappedVariant) {\n msg += ` ${output.subtle(`(mapped to variant '${mappedVariant}')`)}`;\n }\n return msg;\n })\n .join(\"\\n\") + \"\\n\"\n );\n}\n\nfunction handleBundleGeneration(\n sourceId: string,\n extension: string,\n sourcePath: string,\n newFilePath: string\n) {\n if (!fs.existsSync(newFilePath)) {\n return fs.renameSync(sourcePath, newFilePath);\n }\n\n if (sourceId !== \"components\") {\n throw new Error(\"Bundle path for \" + sourceId + \" already exists\");\n }\n\n if (extension === \"strings\") {\n return appendStringsFile(sourcePath, newFilePath);\n }\n\n if (extension === \"stringsdict\") {\n return appendStringsDictFile(sourcePath, newFilePath);\n }\n\n throw new Error(\"Unsupported extension \" + extension);\n}\n\nfunction appendStringsFile(sourcePath: string, destPath: string) {\n const sourceContents = fs.readFileSync(sourcePath, \"utf-8\");\n const newFileContents = fs.readFileSync(destPath, \"utf-8\");\n const newContents = newFileContents + \"\\n\" + sourceContents;\n fs.writeFileSync(destPath, newContents);\n fs.unlinkSync(sourcePath);\n}\n\nfunction appendStringsDictFile(sourcePath: string, destPath: string) {\n const sourceContentsFull = fs.readFileSync(sourcePath, \"utf-8\");\n const sourceContentsContent = sourceContentsFull.split(\"\\n\").slice(3, -4);\n\n const newFileContentsFull = fs.readFileSync(destPath, \"utf-8\");\n const newFileContentsContent = newFileContentsFull.split(\"\\n\").slice(3, -4);\n\n const newContents = `<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<plist version=\"1.0\">\n <dict>\n${[newFileContentsContent, sourceContentsContent].join(\"\\n\")}\n </dict>\n</plist>\n `;\n\n fs.writeFileSync(destPath, newContents);\n fs.unlinkSync(sourcePath);\n}\n"],"names":["fs","consts","path","output"],"mappings":"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","debug_id":"b23b75ff-e7f4-506d-8f68-909661187171"}
@@ -1,29 +1,12 @@
1
1
  "use strict";
2
- !function(){try{var e="undefined"!=typeof window?window:"undefined"!=typeof global?global:"undefined"!=typeof self?self:{},n=(new Error).stack;n&&(e._sentryDebugIds=e._sentryDebugIds||{},e._sentryDebugIds[n]="abf6148b-b36f-5809-b765-ac588ff7207f")}catch(e){}}();
2
+ !function(){try{var e="undefined"!=typeof window?window:"undefined"!=typeof global?global:"undefined"!=typeof self?self:{},n=(new Error).stack;n&&(e._sentryDebugIds=e._sentryDebugIds||{},e._sentryDebugIds[n]="399aa2f0-cd6c-5782-972b-6a17282f684b")}catch(e){}}();
3
3
 
4
4
  var __create = Object.create;
5
5
  var __defProp = Object.defineProperty;
6
- var __defProps = Object.defineProperties;
7
6
  var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
8
- var __getOwnPropDescs = Object.getOwnPropertyDescriptors;
9
7
  var __getOwnPropNames = Object.getOwnPropertyNames;
10
- var __getOwnPropSymbols = Object.getOwnPropertySymbols;
11
8
  var __getProtoOf = Object.getPrototypeOf;
12
9
  var __hasOwnProp = Object.prototype.hasOwnProperty;
13
- var __propIsEnum = Object.prototype.propertyIsEnumerable;
14
- var __defNormalProp = (obj, key, value) => key in obj ? __defProp(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;
15
- var __spreadValues = (a, b) => {
16
- for (var prop in b || (b = {}))
17
- if (__hasOwnProp.call(b, prop))
18
- __defNormalProp(a, prop, b[prop]);
19
- if (__getOwnPropSymbols)
20
- for (var prop of __getOwnPropSymbols(b)) {
21
- if (__propIsEnum.call(b, prop))
22
- __defNormalProp(a, prop, b[prop]);
23
- }
24
- return a;
25
- };
26
- var __spreadProps = (a, b) => __defProps(a, __getOwnPropDescs(b));
27
10
  var __export = (target, all) => {
28
11
  for (var name in all)
29
12
  __defProp(target, name, { get: all[name], enumerable: true });
@@ -55,65 +38,141 @@ var import_path = __toESM(require("path"));
55
38
  var import_consts = __toESM(require("../consts"));
56
39
  var import_output = __toESM(require("../output"));
57
40
  var import_cleanFileName = require("./cleanFileName");
41
+ var import_determineModuleType = require("./determineModuleType");
42
+ var import_generateJsDriverTypeFile = require("./generateJsDriverTypeFile");
58
43
  const stringifySourceId = (projectId) => projectId === "ditto_component_library" ? projectId : `project_${projectId}`;
59
- function generateJsDriver(sources) {
60
- const sourceIdsByName = sources.reduce(
61
- (agg, source) => {
62
- if (source.fileName) {
63
- return __spreadProps(__spreadValues({}, agg), { [(0, import_cleanFileName.cleanFileName)(source.fileName)]: source.id });
64
- }
65
- return agg;
66
- },
67
- {}
68
- );
69
- const projectFileNames = import_fs.default.readdirSync(import_consts.default.TEXT_DIR).filter(
70
- (fileName) => /\.json$/.test(fileName) && !/^components__/.test(fileName)
71
- );
72
- const data = projectFileNames.reduce(
73
- (obj, fileName) => {
74
- const [sourceId, rest] = fileName.split("__");
75
- const [variantApiId] = rest.split(".");
76
- const projectId = sourceIdsByName[sourceId];
77
- const projectIdStr = stringifySourceId(projectId);
78
- if (!obj[projectIdStr]) {
79
- obj[projectIdStr] = {};
80
- }
81
- obj[projectIdStr][variantApiId] = `require('./${fileName}')`;
82
- return obj;
83
- },
84
- {}
85
- );
86
- const componentData = {};
87
- sources.filter((s) => s.type === "components").forEach((componentSource) => {
88
- var _a, _b;
89
- if (componentSource.type !== "components")
90
- return;
91
- (_b = componentData[_a = componentSource.variant]) != null ? _b : componentData[_a] = [];
92
- componentData[componentSource.variant].push(
93
- `...require('./${componentSource.fileName}')`
44
+ function generateJsDriver(sources, format) {
45
+ const moduleType = (0, import_determineModuleType.determineModuleType)();
46
+ const fullyQualifiedSources = getFullyQualifiedJSONSources(sources);
47
+ const variableNameGenerator = createVariableNameGenerator();
48
+ const importStatements = [];
49
+ const data = {};
50
+ const dataComponents = {};
51
+ fullyQualifiedSources.forEach((source) => {
52
+ var _a, _b, _c;
53
+ let variableName;
54
+ if (source.type === "components") {
55
+ variableName = variableNameGenerator.generate(
56
+ source.fileName.split(".")[0]
57
+ );
58
+ } else {
59
+ const fileNameWithoutExtension = source.fileName.split(".")[0];
60
+ variableName = variableNameGenerator.generate(
61
+ fileNameWithoutExtension.split("__")[0]
62
+ );
63
+ }
64
+ importStatements.push(
65
+ getImportStatement(source.fileName, variableName, moduleType)
94
66
  );
67
+ if (source.type === "project") {
68
+ const { variantApiId } = source;
69
+ const projectId = stringifySourceId(source.projectId);
70
+ (_a = data[projectId]) != null ? _a : data[projectId] = {};
71
+ data[projectId][variantApiId] = `{...${variableName}}`;
72
+ } else {
73
+ (_c = dataComponents[_b = source.variantApiId]) != null ? _c : dataComponents[_b] = [];
74
+ dataComponents[source.variantApiId].push(`...${variableName}`);
75
+ }
95
76
  });
96
- Object.keys(componentData).forEach((key) => {
77
+ Object.keys(dataComponents).forEach((key) => {
97
78
  var _a;
98
79
  (_a = data.ditto_component_library) != null ? _a : data.ditto_component_library = {};
99
80
  let str = "{";
100
- componentData[key].forEach((k, i) => {
81
+ dataComponents[key].forEach((k, i) => {
101
82
  str += k;
102
- if (i < componentData[key].length - 1)
83
+ if (i < dataComponents[key].length - 1)
103
84
  str += ", ";
104
85
  });
105
86
  str += "}";
106
87
  data.ditto_component_library[key] = str;
107
88
  });
108
- let dataString = `module.exports = ${JSON.stringify(data, null, 2)}`.replace(/"require\((.*)\)"/g, "require($1)").replace(/"\{/g, "{").replace(/\}"/g, "}");
89
+ let dataString = "";
90
+ dataString += importStatements.join("\n") + "\n\n";
91
+ dataString += `${getExportPrefix(moduleType)}`;
92
+ dataString += `${JSON.stringify(data, null, 2)}`.replace(/"\{/g, "{").replace(/\}"/g, "}");
109
93
  const filePath = import_path.default.resolve(import_consts.default.TEXT_DIR, "index.js");
110
94
  import_fs.default.writeFileSync(filePath, dataString, { encoding: "utf8" });
95
+ (0, import_generateJsDriverTypeFile.generateJsDriverTypeFile)({
96
+ format,
97
+ moduleType
98
+ });
111
99
  return `Generated .js SDK driver at ${import_output.default.info(filePath)}`;
112
100
  }
101
+ function getFullyQualifiedJSONSources(sources) {
102
+ const projectIdsByCleanedFileName = /* @__PURE__ */ new Map();
103
+ sources.forEach((source) => {
104
+ if (!source.fileName || source.type === "components") {
105
+ return;
106
+ }
107
+ projectIdsByCleanedFileName.set((0, import_cleanFileName.cleanFileName)(source.fileName), source.id);
108
+ });
109
+ const fileNames = import_fs.default.readdirSync(import_consts.default.TEXT_DIR);
110
+ return fileNames.filter((f) => import_path.default.extname(f) === ".json").map((fileName) => {
111
+ const parts = fileName.split("__");
112
+ if (parts.length === 3) {
113
+ const [, folderApiId, rest] = parts;
114
+ const [variantApiId] = rest.split(".");
115
+ return {
116
+ type: "components",
117
+ variantApiId,
118
+ folderApiId,
119
+ fileName
120
+ };
121
+ }
122
+ if (parts.length === 2) {
123
+ const [projectName, rest] = parts;
124
+ const [variantApiId] = rest.split(".");
125
+ const key = (0, import_cleanFileName.cleanFileName)(fileName.split("__")[0]);
126
+ const projectId = projectIdsByCleanedFileName.get(key) || "";
127
+ return {
128
+ type: "project",
129
+ projectId,
130
+ projectName,
131
+ variantApiId,
132
+ fileName
133
+ };
134
+ }
135
+ throw new Error("Invalid JSON file generated: " + fileName);
136
+ });
137
+ }
138
+ function createVariableNameGenerator() {
139
+ const variableNames = /* @__PURE__ */ new Set();
140
+ return {
141
+ generate: (str) => {
142
+ const baseName = str.replace(/(\W|-)/g, "_");
143
+ let name = baseName;
144
+ let i = 1;
145
+ while (variableNames.has(name)) {
146
+ name = `${baseName}${i}`;
147
+ i++;
148
+ }
149
+ variableNames.add(name);
150
+ return name;
151
+ }
152
+ };
153
+ }
154
+ function getExportPrefix(moduleType) {
155
+ if (moduleType === "commonjs") {
156
+ return "module.exports = ";
157
+ }
158
+ if (moduleType === "module") {
159
+ return "export default ";
160
+ }
161
+ throw new Error("Unknown module type: " + moduleType);
162
+ }
163
+ function getImportStatement(fileName, variableName, moduleType) {
164
+ if (moduleType === "commonjs") {
165
+ return `const ${variableName} = require('./${fileName}');`;
166
+ }
167
+ if (moduleType === "module") {
168
+ return `import ${variableName} from './${fileName}';`;
169
+ }
170
+ throw new Error("Unknown module type: " + moduleType);
171
+ }
113
172
  // Annotate the CommonJS export names for ESM import in node:
114
173
  0 && (module.exports = {
115
174
  generateJsDriver
116
175
  });
117
176
  //# sourceMappingURL=generateJsDriver.js.map
118
177
 
119
- //# debugId=abf6148b-b36f-5809-b765-ac588ff7207f
178
+ //# debugId=399aa2f0-cd6c-5782-972b-6a17282f684b